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į:
#includetarpt 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
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 pagrindinis2 veiksmas: paleiskite GDB
Kai programa bus sukompiliuota su derinimo simboliais, paleiskite GDB, kaip argumentą pateikdami vykdomąjį failą.
$ gdb pagrindinis3 veiksmas: paleiskite programą
Paleiskite programą GDB eilutėje įvesdami „run“ arba „r“:
$ ( gdb ) paleistiTada 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 ) btRodomas 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: 5Tai 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ęstiPrograma 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 ) mestiTai 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.