Napake segmentacije je lahko težko odpravljati, ker pogosto povzročijo zrušitve brez zagotavljanja podrobnih sporočil o napakah. Vendar pa lahko orodja, kot je GDB (GNU Debugger), pomagajo prepoznati vir napake segmentacije s pregledom stanja programa in sledi sklada v času napake.
Pomembno je omeniti, da so napake pri segmentaciji običajno posledica programskih napak in se štejejo za napake. Odpraviti jih je treba s pregledom in popravkom problematične kode. Pogosti vzroki za napake pri segmentaciji vključujejo:
- Dereferenciranje ničelnih ali neinicializiranih kazalcev
- Pisanje ali branje zunaj meja matrike
- Uporaba pomnilnika, ki je bil predhodno razporejen ali sproščen
- Prelivanje sklada ali okvara sklada
- Uporaba neinicializiranih spremenljivk
S skrbnim pregledom vaše kode in uporabo orodij za razhroščevanje, kot je GDB, lahko prepoznate in popravite napake segmentacije, s čimer zagotovite, da vaš program deluje pravilno in ne naleti na te napake.
Razhroščevalnik GDB
GDB (GNU Debugger) je zmogljivo orodje za odpravljanje napak, ki pomaga prepoznati in analizirati težave v prevedenih programih, vključno z napakami segmentacije. Omogoča vam, da pregledate stanje programa, sprožite prekinitvene točke in opazujete potek izvajanja.
Če želite učinkovito uporabiti GDB za odpravljanje napak pri segmentaciji, morate prevesti svoj program C++ z omogočenimi simboli za odpravljanje napak. Ti simboli vključujejo dodatne informacije o strukturi programa, spremenljivkah in funkcijah, ki pomagajo pri procesu odpravljanja napak.
Iskanje napake segmentacije v C++ z GDB
Tukaj je primer delčka kode, ki povzroči napako pri segmentaciji:
#includeint glavni ( ) {
int * ptr = nullptr ;
* ptr = 5 ;
vrnitev 0 ;
}
Najprej razložimo kodo. Nato bomo v korakih razpravljali o iskanju napake segmentacije v prejšnji kodi.
Direktiva predprocesorja »#include
Znotraj funkcije main() je deklaracija spremenljivke kazalca »ptr« tipa int*. Vrednost »nullptr« se uporablja kot inicializacija kazalca, ki je posebna vrednost ničelnega kazalca, ki označuje, da ne kaže na nobeno veljavna pomnilniška lokacija.
Poskusi dereferenciranja se izvedejo z ničelnim kazalcem »ptr« v naslednji vrstici, ki je »*ptr = 5;«. V tem primeru, ker je »ptr« nastavljen na »nullptr«, ni veljavne pomnilniške lokacije za dostop.
Zdaj bomo razpravljali o nekaterih korakih, ki jih je treba sprejeti za prevajanje programa, da bi našli napako segmentacije.
1. korak: Omogočite simbole za odpravljanje napak
Za začetek poskrbite, da boste svoj program C++ prevedli z omogočenimi simboli za odpravljanje napak. Za zagotavljanje informacij o odpravljanju napak izvedljivi datoteki med prevajanjem uporabite zastavico »-g«. Razmislite o primeru, ko imamo datoteko C++ z imenom 'main.cpp'.
$ g++ -g main.cpp -O glavni2. korak: Zaženite GDB
Ko je program preveden s simboli za odpravljanje napak, zaženite GDB tako, da posredujete izvedljivo datoteko kot argument.
$ gdb glavni3. korak: Zaženite program
Zaženite program tako, da v poziv GDB vnesete »run« ali »r«:
$ ( gdb ) tečiVaš program se bo nato začel izvajati.
4. korak: Ugotovite napako segmentacije
Program se nadaljuje, dokler ne naleti na napako segmentacije. Program se nato preneha izvajati in GDB prikaže sporočilo o napaki.
Na primer: razmislimo o prej razloženi kodi, pri kateri, ko poskušamo dodeliti vrednost 5 pomnilniški lokaciji, na katero kaže ničelni kazalec, pride do napake segmentacije. Program se takoj konča na vrstici, kjer pride do napake segmentacije.
Ko zaženete ta program z GDB, boste videli podoben izhod kot je naslednji:
Ta izhod kaže, da je prišlo do napake segmentacije v glavni funkciji v vrstici 5 datoteke »main.cpp«.
5. korak: Preglejte sled sklada
Če želite pridobiti več vpogleda v napako segmentacije, lahko pregledate sled sklada z ukazom »backtrace« ali preprosto »bt«. Ta ukaz prikaže zaporedje klicev funkcij, ki vodi do zrušitve.
$ ( gdb ) btPrikaže se sled sklada, ki označuje funkcije, ki so bile poklicane pred napako segmentacije:
Ta izhod nam pove, da je prišlo do napake segmentacije v glavni funkciji v vrstici 5 datoteke »main.cpp«.
6. korak: Nastavite prekinitvene točke
Če želite nadalje raziskati, lahko nastavite prekinitvene točke v določenih vrsticah kode, da zaustavite izvajanje programa na teh točkah. To vam omogoča, da pregledate stanje in spremenljivke programa. Če želite na primer nastaviti prekinitveno točko v 5. vrstici »main.cpp«, uporabite ukaz »break«, kot sledi:
$ ( gdb ) odmor main.cpp: 5To nastavi prekinitveno točko v 5. vrstici datoteke »main.cpp«:
7. korak: Nadaljujte z izvajanjem
Ko nastavite prekinitvene točke, nadaljujte z izvajanjem programa z ukazom »nadaljuj« ali preprosto »c«:
$ ( gdb ) nadaljevatiProgram se nadaljuje, dokler ne doseže prekinitvene točke.
8. korak: Preglejte spremenljivke in kodo
Ko se program ustavi na prelomni točki, lahko uporabite različne ukaze GDB, da pregledate spremenljivke, korakate skozi kodo in raziščete vzrok napake segmentacije.
9. korak: Zaprite GDB
Ko končate z odpravljanjem napak, lahko GDB zapustite z ukazom “quit”:
$ ( gdb ) prenehatiTo zagotavlja osnovni pregled uporabe GDB za iskanje napak segmentacije v programih C++. GDB ponuja veliko več funkcij in ukazov, ki lahko pomagajo pri odpravljanju napak, za bolj poglobljene informacije pa si lahko ogledate dokumentacijo GDB.
Zaključek
Ta članek prikazuje uporabo GDB za iskanje napake segmentacije v C++. Pojasnili smo vam korake, ki jih morate upoštevati. Ti koraki zagotavljajo izčrpno razlago o tem, kako najti napako segmentacije v C++ z uporabo GDB. Če sledite tem korakom in uporabite funkcije GDB, lahko učinkovito poiščete in odpravite napako pri segmentaciji v svojem programu C++.