Segmentācijas kļūdu atkļūdošana var būt sarežģīta, jo bieži vien tās izraisa avārijas, nesniedzot detalizētus kļūdu ziņojumus. Tomēr tādi rīki kā GDB (GNU atkļūdotājs) var palīdzēt identificēt segmentācijas kļūdas avotu, pārbaudot programmas stāvokli un steka izsekošanu kļūdas brīdī.
Ir svarīgi atzīmēt, ka segmentācijas kļūdas parasti izraisa programmēšanas kļūdas un tiek uzskatītas par kļūdām. Tie ir jānovērš, pārskatot un labojot problemātisko kodu. Biežākie segmentācijas kļūdu cēloņi ir:
- Atsauces uz nulles vai neinicializētiem rādītājiem atcelšana
- Rakstīšana vai lasīšana ārpus masīva robežām
- Izmantojot atmiņu, kas iepriekš ir izņemta vai atbrīvota
- Stack overflow vai steck corruption
- Neinicializētu mainīgo izmantošana
Rūpīgi pārbaudot kodu un izmantojot atkļūdošanas rīkus, piemēram, GDB, varat identificēt un novērst segmentācijas kļūdas, nodrošinot, ka programma darbojas pareizi un nesaskaras ar šīm kļūdām.
GDB atkļūdotājs
GDB (GNU atkļūdotājs) ir spēcīgs atkļūdošanas rīks, kas palīdz identificēt un analizēt kompilēto programmu problēmas, tostarp segmentācijas kļūdas. Tas ļauj pārbaudīt programmas stāvokli, aktivizēt pārtraukuma punktus un novērot izpildes plūsmu.
Lai efektīvi izmantotu GDB segmentācijas kļūdu atkļūdošanai, jums ir jākompilē C++ programma ar iespējotiem atkļūdošanas simboliem. Šie simboli ietver papildu informāciju par programmas struktūru, mainīgajiem lielumiem un funkcijām, kas palīdz atkļūdošanas procesā.
Segmentācijas kļūdas atrašana programmā C++ ar GDB
Tālāk ir sniegts koda fragmenta piemērs, kas izraisa segmentācijas kļūdu:
#includestarpt galvenais ( ) {
starpt * ptr = nullptr ;
* ptr = 5 ;
atgriezties 0 ;
}
Vispirms izskaidrosim kodu. Pēc tam mēs pakāpeniski apspriedīsim segmentācijas kļūdas atrašanu iepriekšējā kodā.
Priekšprocesora direktīva “#include
Funkcijā main() ir int* tipa rādītāja mainīgā “ptr” deklarācija. “Nullptr” vērtība tiek izmantota kā rādītāja inicializācija, kas ir īpaša nulles rādītāja vērtība, kas norāda, ka tā nenorāda uz nevienu. derīga atmiņas vieta.
Atsauces atcelšanas mēģinājumi tiek veikti ar nulles rādītāju “ptr” nākamajā rindā, kas ir “*ptr = 5;”. Šajā gadījumā, tā kā “ptr” ir iestatīts uz “nullptr”, nav derīgas atmiņas vietas, kurai piekļūt.
Tagad mēs apspriedīsim dažus soļus, kas jāveic, lai apkopotu programmu, lai atrastu segmentācijas kļūdu.
1. darbība: iespējojiet atkļūdošanas simbolus
Lai sāktu, noteikti kompilējiet savu C++ programmu ar iespējotiem atkļūdošanas simboliem. Lai kompilācijas laikā nodrošinātu izpildāmā faila atkļūdošanas informāciju, izmantojiet karodziņu “-g”. Apsveriet gadījumu, kad mums ir C++ fails ar nosaukumu “main.cpp”.
$ g++ -g main.cpp -O galvenais2. darbība: palaidiet GDB
Kad programma ir kompilēta ar atkļūdošanas simboliem, palaidiet GDB, nododot izpildāmo failu kā argumentu.
$ gdb galvenais3. darbība: palaidiet programmu
Sāciet programmu, ierakstot “palaist” vai “r” GDB uzvednē:
$ ( gdb ) palaistPēc tam jūsu programma sāks izpildīt.
4. darbība: identificējiet segmentācijas kļūdu
Programma turpina darboties, līdz tiek konstatēta segmentācijas kļūda. Pēc tam programma pārstāj darboties, un GDB rada kļūdas ziņojumu.
Piemēram: aplūkosim iepriekš izskaidroto kodu, kur, mēģinot piešķirt vērtību 5 atmiņas vietai, uz kuru norāda nulles rādītājs, rodas segmentācijas kļūda. Programma nekavējoties beidzas pie līnijas, kurā rodas segmentācijas kļūda.
Palaižot šo programmu ar GDB, jūs redzēsit līdzīgu izvadi kā:
Šī izvade norāda, ka galvenajā funkcijā “main.cpp” faila 5. rindā ir radusies segmentācijas kļūda.
5. darbība: pārbaudiet steka izsekojumu
Lai iegūtu plašāku ieskatu segmentācijas kļūmē, varat pārbaudīt steka izsekošanu, izmantojot komandu “backtrace” vai vienkārši “bt”. Šī komanda parāda funkciju izsaukumu secību, kas noved pie avārijas.
$ ( gdb ) btTiek parādīts steka trasējums, kas norāda funkcijas, kas tiek izsauktas pirms segmentācijas kļūdas:
Šī izvade norāda, ka segmentācijas kļūme radās galvenajā funkcijā faila “main.cpp” 5. rindā.
6. darbība: iestatiet pārtraukuma punktus
Lai turpinātu izmeklēšanu, varat iestatīt pārtraukuma punktus noteiktās koda rindās, lai apturētu programmas izpildi šajos punktos. Tas ļauj pārbaudīt programmas stāvokli un mainīgos. Piemēram, lai iestatītu pārtraukuma punktu “main.cpp” 5. rindiņā, izmantojiet komandu “break” šādi:
$ ( gdb ) pārtraukums main.cpp: 5Tas iestata pārtraukuma punktu faila “main.cpp” 5. rindiņā:
7. darbība: atsāciet izpildi
Pēc pārtraukuma punktu iestatīšanas atsāciet programmas izpildi, izmantojot komandu 'turpināt' vai vienkārši 'c':
$ ( gdb ) TurpinātProgramma turpina darboties, līdz tā sasniedz pārtraukuma punktu.
8. darbība: pārbaudiet mainīgos un kodu
Kad programma tiek apturēta pārtraukuma punktā, varat izmantot dažādas GDB komandas, lai pārbaudītu mainīgos, izietu cauri kodam un izpētītu segmentācijas kļūdas cēloni.
9. darbība. Aizveriet GDB
Kad esat pabeidzis atkļūdošanu, varat iziet no GDB, izmantojot komandu “quit”:
$ ( gdb ) atmestTas sniedz pamata pārskatu par GDB izmantošanu, lai atrastu segmentācijas kļūdas C++ programmās. GDB nodrošina daudz vairāk līdzekļu un komandu, kas var palīdzēt atkļūdot, un varat skatīt GDB dokumentāciju, lai iegūtu padziļinātu informāciju.
Secinājums
Šis raksts parāda GDB izmantošanu, lai atrastu segmentācijas kļūdu C++. Mēs jums izskaidrojām darbības, kas jāveic. Šīs darbības sniedz visaptverošu skaidrojumu par to, kā atrast segmentācijas kļūdu programmā C++, izmantojot GDB. Veicot šīs darbības un izmantojot GDB funkcijas, varat efektīvi atrast un atkļūdot segmentācijas kļūdas avotu savā C++ programmā.