Els errors de segmentació poden ser difícils de depurar perquè sovint provoquen bloquejos sense proporcionar missatges d'error detallats. Tanmateix, eines com GDB (GNU Debugger) poden ajudar a identificar l'origen de l'error de segmentació examinant l'estat del programa i el rastre de la pila en el moment de l'error.
És important tenir en compte que els errors de segmentació solen ser causats per errors de programació i es consideren errors. S'han de solucionar revisant i corregint el codi problemàtic. Les causes habituals dels errors de segmentació inclouen:
- Desreferenciació dels punters nuls o no inicialitzats
- Escriptura o lectura fora dels límits d'una matriu
- Utilitzant una memòria que s'ha desassignat o alliberat prèviament
- Desbordament de pila o corrupció de pila
- Ús de variables no inicialitzades
Examinant acuradament el codi i utilitzant eines de depuració com GDB, podeu identificar i corregir els errors de segmentació, assegurant-vos que el vostre programa funcioni correctament i no trobi aquests errors.
Depurador GDB
GDB (GNU Debugger) és una potent eina de depuració que ajuda a identificar i analitzar els problemes dels programes compilats, inclosos els errors de segmentació. Us permet examinar l'estat del programa, activar els punts d'interrupció i observar el flux d'execució.
Per utilitzar GDB de manera eficaç per depurar els errors de segmentació, heu de compilar el vostre programa C++ amb els símbols de depuració habilitats. Aquests símbols inclouen informació addicional sobre l'estructura, les variables i les funcions del programa que ajuda en el procés de depuració.
Trobar l'error de segmentació en C++ amb GDB
Aquí teniu un exemple de fragment de codi que provoca un error de segmentació:
#inclouint principal ( ) {
int * ptr = nullptr ;
* ptr = 5 ;
tornar 0 ;
}
Primer expliquem el codi. A continuació, parlarem en passos sobre com trobar una falla de segmentació al codi anterior.
La directiva del preprocessador '#include
Dins de la funció main(), hi ha una declaració d'una variable de punter “ptr” de tipus int*. El valor “nullptr” s'utilitza com a inicialització del punter, que és un valor especial de punter nul que indica que no apunta cap a cap. ubicació de memòria vàlida.
Els intents de desreferència es fan amb el punter nul 'ptr' a la línia següent que és '*ptr = 5;'. En aquest cas, com que 'ptr' està establert en 'nullptr', no hi ha cap ubicació de memòria vàlida per accedir.
Ara, parlarem d'alguns passos que s'han d'adoptar per compilar el programa per tal de trobar l'error de segmentació.
Pas 1: habiliteu els símbols de depuració
Per començar, assegureu-vos de compilar el vostre programa C++ amb els símbols de depuració habilitats. Per proporcionar la informació de depuració al fitxer executable durant la compilació, utilitzeu el senyalador '-g'. Considereu el cas en què tenim un fitxer C++ anomenat 'main.cpp'.
$ g++ -g main.cpp -O principalPas 2: executeu GDB
Un cop compilat el programa amb símbols de depuració, executeu GDB passant el fitxer executable com a argument.
$ gdb principalPas 3: inicieu el programa
Inicieu el programa escrivint 'executar' o 'r' a l'indicador GDB:
$ ( gdb ) correrAleshores, el vostre programa començarà a executar-se.
Pas 4: identifiqueu l'error de segmentació
El programa continua executant-se fins que troba un error de segmentació. Aleshores, el programa deixa d'executar-se i GDB genera un missatge d'error.
Per exemple: considerem el codi explicat anteriorment on quan intentem assignar el valor de 5 a la ubicació de memòria a la qual apunta el punter nul, es produeix un error de segmentació. El programa acaba immediatament a la línia on es produeix l'error de segmentació.
Quan executeu aquest programa amb GDB, veureu una sortida similar a la següent:
Aquesta sortida indica que s'ha produït un error de segmentació a la funció principal a la línia 5 del fitxer 'main.cpp'.
Pas 5: examineu la traça de la pila
Per obtenir més informació sobre l'error de segmentació, podeu examinar el rastre de la pila mitjançant l'ordre 'backtrace' o simplement 'bt'. Aquesta ordre mostra la seqüència de trucades de funció que condueixen a l'error.
$ ( gdb ) btEs mostra la traça de la pila que indica les funcions que es criden abans de l'error de segmentació:
Aquesta sortida ens indica que l'error de segmentació s'ha produït a la funció principal a la línia 5 del fitxer 'main.cpp'.
Pas 6: establiu els punts d'interrupció
Per investigar més, podeu establir els punts d'interrupció en línies específiques de codi per aturar l'execució del programa en aquests punts. Això us permet inspeccionar l'estat i les variables del programa. Per exemple, per establir un punt d'interrupció a la línia 5 del 'main.cpp', utilitzeu l'ordre 'break' de la següent manera:
$ ( gdb ) trencar main.cpp: 5Això estableix un punt d'interrupció a la línia 5 del fitxer 'main.cpp':
Pas 7: reprendre l'execució
Després d'establir els punts d'interrupció, reprèn l'execució del programa mitjançant l'ordre 'continua' o simplement 'c':
$ ( gdb ) continuarEl programa continua executant-se fins que arriba al punt d'interrupció.
Pas 8: inspeccioneu les variables i el codi
Una vegada que el programa s'atura en un punt d'interrupció, podeu utilitzar diverses ordres GDB per examinar les variables, passar pel codi i investigar la causa de l'error de segmentació.
Pas 9: sortiu de GDB
Un cop acabeu la depuració, podeu sortir de GDB mitjançant l'ordre 'quit':
$ ( gdb ) sortirAixò proporciona una visió general bàsica de l'ús de GDB per trobar els errors de segmentació als programes C++. GDB ofereix moltes més funcions i ordres que poden ajudar amb la depuració, i podeu consultar la documentació de GDB per obtenir una informació més detallada.
Conclusió
Aquest article demostra la utilització de GDB per trobar l'error de segmentació en C++. Us hem explicat els passos que cal seguir. Aquests passos proporcionen una explicació completa sobre com trobar un error de segmentació en C++ mitjançant GDB. Seguint aquests passos i utilitzant les funcions de GDB, podeu localitzar i depurar de manera efectiva l'origen de l'error de segmentació al vostre programa C++.