Kaip rasti C++ segmentavimo gedimo priežastį

Kaip Rasti C Segmentavimo Gedimo Priezasti



Segmentavimo klaida, dar žinoma kaip segmentavimo klaida, yra tam tikra klaida, kuri atsitinka, kai programa bando pasiekti atminties skyrių, prie kurio ji neturi teisės. Kai įvyksta segmentavimo klaida, operacinė sistema nutraukia programą, kad ji nesukeltų papildomų problemų. Ši klaida paprastai rodo programos kodo klaidą arba programavimo klaidą, pvz., prieigą prie nepainicijuoto rodyklės, nuorodos į nulinę žymeklį panaikinimą arba masyvo ribų peržengimą.

Segmentavimo klaidas gali būti sudėtinga derinti, nes dėl jų dažnai įvyksta strigtys, nepateikiant išsamių klaidų pranešimų. Tačiau tokie įrankiai kaip GDB (GNU Debugger), gali padėti nustatyti segmentavimo gedimo šaltinį, tiriant programos būseną ir dėklo pėdsaką klaidos metu.

Svarbu pažymėti, kad segmentavimo klaidas paprastai sukelia programavimo klaidos ir jos laikomos klaidomis. Jie turėtų būti ištaisyti peržiūrint ir pataisant probleminį kodą. Dažniausios segmentavimo gedimų priežastys:







  • Nulinių arba nepainicijuotų rodyklių nuorodos panaikinimas
  • Rašymas ar skaitymas už masyvo ribų
  • Naudojama atmintis, kuri anksčiau buvo išskirstyta arba išleista
  • Krūvos perpildymas arba krūvos sugadinimas
  • Neinicijuotų kintamųjų naudojimas

Atidžiai išnagrinėję kodą ir naudodami derinimo įrankius, pvz., GDB, galite nustatyti ir ištaisyti segmentavimo klaidas, užtikrindami, kad jūsų programa tinkamai veiktų ir nesusidurtų su šiomis klaidomis.



GDB Debugger

GDB (GNU Debugger) yra galingas derinimo įrankis, padedantis nustatyti ir analizuoti sukompiliuotų programų problemas, įskaitant segmentavimo klaidas. Tai leidžia ištirti programos būseną, suaktyvinti pertraukos taškus ir stebėti vykdymo eigą.



Norėdami efektyviai naudoti GDB segmentavimo gedimams derinti, turite sukompiliuoti savo C++ programą su įjungtais derinimo simboliais. Šie simboliai apima papildomą informaciją apie programos struktūrą, kintamuosius ir funkcijas, kurios padeda derinimo procese.





Segmentavimo gedimo radimas C++ naudojant GDB

Pateikiame kodo fragmento, sukeliančio segmentavimo gedimą, pavyzdį:

#include

tarpt pagrindinis ( ) {

tarpt * ptr = nullptr ;

* ptr = 5 ;

grąžinti 0 ;

}

Pirmiausia paaiškinkime kodą. Tada aptarsime, kaip rasti segmentavimo gedimą ankstesniame kode.



Pirminio procesoriaus direktyva „#include “ prideda reikiamą antraštės failą, kuriame pateikiamos įvesties ir išvesties srauto charakteristikos C++.

Funkcijoje main() yra int* tipo žymeklio kintamojo „ptr“ deklaracija. „Nullptr“ reikšmė naudojama kaip rodyklės inicijavimas, o tai yra speciali nulinės rodyklės reikšmė, nurodanti, kad ji nenurodo į jokią. galiojanti atminties vieta.

Nuorodos panaikinimas bandomas naudojant nulinę rodyklę „ptr“ kitoje eilutėje, kuri yra „*ptr = 5;“. Šiuo atveju, kadangi „ptr“ nustatyta kaip „nullptr“, nėra tinkamos atminties vietos, kurią būtų galima pasiekti.

Dabar aptarsime kai kuriuos veiksmus, kurių reikia imtis norint sudaryti programą, kad būtų nustatyta segmentavimo klaida.

1 veiksmas: įjunkite derinimo simbolius

Norėdami pradėti, būtinai sukompiliuokite savo C++ programą su įjungtais derinimo simboliais. Norėdami pateikti derinimo informaciją vykdomajam failui kompiliavimo metu, naudokite vėliavėlę „-g“. Apsvarstykite atvejį, kai turime C++ failą pavadinimu „main.cpp“.

$ g++ -g pagrindinis.cpp -O pagrindinis

2 veiksmas: paleiskite GDB

Kai programa bus sukompiliuota su derinimo simboliais, paleiskite GDB, kaip argumentą pateikdami vykdomąjį failą.

$ gdb pagrindinis

3 veiksmas: paleiskite programą

Paleiskite programą GDB eilutėje įvesdami „run“ arba „r“:

$ ( gdb ) paleisti

Tada jūsų programa pradės vykdyti.

4 veiksmas: nustatykite segmentavimo gedimą

Programa veikia tol, kol randama segmentavimo klaida. Tada programa nustoja veikti, o GDB pateikia klaidos pranešimą.

Pavyzdžiui: panagrinėkime anksčiau paaiškintą kodą, kai bandydami priskirti 5 reikšmę atminties vietai, į kurią nurodo nulinis rodyklė, atsiranda segmentavimo klaida. Programa iš karto baigiasi ties linija, kurioje įvyksta segmentavimo klaida.

Vykdydami šią programą su GDB, pamatysite panašų išvestį kaip:

Ši išvestis rodo, kad pagrindinėje funkcijoje „main.cpp“ failo 5 eilutėje įvyko segmentavimo klaida.

5 veiksmas: patikrinkite kamino pėdsaką

Norėdami gauti daugiau įžvalgų apie segmentavimo gedimą, galite ištirti krūvos pėdsaką naudodami komandą „backtrace“ arba tiesiog „bt“. Ši komanda rodo funkcijų iškvietimų, sukeliančių gedimą, seką.

$ ( gdb ) bt

Rodomas dėklo pėdsakas, nurodantis funkcijas, kurios buvo iškviestos prieš segmentavimo gedimą:

Ši išvestis nurodo, kad pagrindinėje funkcijoje „main.cpp“ failo 5 eilutėje įvyko segmentavimo klaida.

6 veiksmas: nustatykite lūžio taškus

Norėdami toliau tirti, galite nustatyti lūžio taškus konkrečiose kodo eilutėse, kad sustabdytumėte programos vykdymą tuose taškuose. Tai leidžia patikrinti programos būseną ir kintamuosius. Pavyzdžiui, norėdami nustatyti pertraukos tašką „main.cpp“ 5 eilutėje, naudokite komandą „break“ taip:

$ ( gdb ) pertrauka main.cpp: 5

Tai nustato lūžio tašką „main.cpp“ failo 5 eilutėje:

7 veiksmas: tęskite vykdymą

Nustatę pertraukos taškus, atnaujinkite programos vykdymą naudodami komandą „tęsti“ arba tiesiog „c“:

$ ( gdb ) Tęsti

Programa tęsiasi tol, kol pasiekia pertraukos tašką.

8 veiksmas: patikrinkite kintamuosius ir kodą

Kai programa sustoja ties pertraukos tašku, galite naudoti įvairias GDB komandas, kad patikrintumėte kintamuosius, pereitumėte per kodą ir ištirtumėte segmentavimo gedimo priežastį.

9 veiksmas: išeikite iš GDB

Baigę derinti, galite išeiti iš GDB naudodami komandą „quit“:

$ ( gdb ) mesti

Tai suteikia pagrindinę GDB naudojimo C++ programų segmentavimo gedimams rasti apžvalgą. GDB suteikia daug daugiau funkcijų ir komandų, kurios gali padėti derinti, o išsamesnės informacijos galite rasti GDB dokumentacijoje.

Išvada

Šiame straipsnyje parodytas GDB panaudojimas C++ segmentavimo klaidai rasti. Mes paaiškinome jums veiksmus, kurių reikia laikytis. Šie veiksmai pateikia išsamų paaiškinimą, kaip rasti segmentavimo gedimą C++ naudojant GDB. Atlikdami šiuos veiksmus ir naudodami GDB funkcijas, galite efektyviai rasti ir derinti segmentavimo gedimo šaltinį savo C++ programoje.