GNU Debugger s'utilitza per depurar un programa, per analitzar un error o per veure què fa el programa en un punt concret. Va ser desenvolupat pel Projecte GNU a la dècada de 1980 i ha estat un dels depuradors de línia d'ordres més utilitzats, així com un dels programari GNU més popular.
Primer escrivim un petit programa C que després depurarem. Per començar, creeu-ne un .c
fitxer utilitzant vim
o qualsevol editor de la vostra elecció:
prova vim.c
Creeu el programa C següent:
#inclou int main() { int i = 5; flotant f = 5,5 i = i + 3; f = f + 2,2; printf("El valor de i i f són: %d i %f\n", i, f); retorn 0; }
Premeu escapar
per anar al mode d'ordres vim. Després escriviu :wq
per guardar el programa i sortir.
Compileu i comproveu si el programa s'executa:
gcc test.c -o test ./test El valor de i i f són: 8 i 7,700000
Per habilitar el suport de depuració en un programa, el compilem amb -g
bandera. Si no s'utilitza el senyalador, l'usuari encara pot depurar el programa, encara que amb opcions limitades.
prova gcc.c -g -o prova
Per començar la depuració el nostre fitxer executable prova
en gdb
, nosaltres correm:
prova gdb
Obrirà el gdb
consola, on podeu escriure gdb
ordres. Per veure una llista d'ordres, utilitzeu ajuda
comandament.
$(gdb) help Llista de classes d'ordres: àlies -- Àlies d'altres punts d'interrupció d'ordres -- Fer que el programa s'aturi en determinats punts de dades -- Examinar fitxers de dades -- Especificar i examinar fitxers interns -- Ordres de manteniment fosques -- Funcions obscures en execució -- Execució de la pila del programa -- Examinació de l'estat de la pila -- Suport per a consultes d'estat -- Punts de traça d'instal·lacions de suport -- Traça de l'execució del programa sense aturar el programa definit per l'usuari -- Ordres definides per l'usuari Escriviu "ajuda" seguida d'un nom de classe per obtenir una llista d'ordres d'aquesta classe. Escriviu "ajuda a tots" per a la llista de totes les ordres. Escriviu "ajuda" seguit del nom de l'ordre per a la documentació completa. Escriviu "apropos word" per cercar ordres relacionades amb "word". Les abreviatures de noms de comanda es permeten si no són ambigües.
A continuació, podeu escriure ajuda nom_classe
per veure les ordres que pertanyen a aquesta classe. Per cercar ordres amb una subcadena, utilitzeu a propòsit de la subcadena
.
Per establir un punt d'interrupció quan el programa entra en una funció, correr:
$(gdb) break main
Aquí establim un punt d'interrupció a l'única funció del nostre codi, és a dir. principal
. Utilitzeu l'ordre correr
per executar el programa fins al següent punt d'interrupció, o fins a sortir.
$(gdb) executar
Per establir un punt d'interrupció en una ubicació concreta d'una funció, utilitzar:
trencar *principal + 4
Això establirà un punt d'interrupció a la quarta línia de la funció principal.
Ara, per sobrepassar el flux del programa a la següent línia de codi, simplement executeu el pas
comandament.
$(gdb) pas 5: flotant f = 5,5;
Per mostrar el contingut d'una variable, correr visualització
.
$(gdb) mostra i 6: i = 5
Per modificar el contingut d'una variable, que podria ser necessari per analitzar l'execució d'un programa sota valors específics d'una variable, executar set variable = Expressió
.
$(gdb) estableix la variable i=10 $(gdb) mostra i 7: i = 10
Aquí, l'"expressió" pot ser qualsevol expressió vàlida (aritmètica/lògica). Per simplificar, només assignem un altre valor (10) a la variable i
.
Per imprimir el codi de muntatge del programa, utilitzar l'ordre desmuntar nom de funció
:
Utilitzeu només desmuntar
per imprimir codi de muntatge per a tot el programa. Observeu la fletxa en una línia determinada del codi de muntatge. Indica que la sessió de depuració està actualment en pausa en aquesta ubicació de memòria en particular (és a dir, aquesta línia de codi).
Per saltar el depurador a una línia de codi concreta, correr:
$(gdb) jump *principal + 2 Continuant a 0x400528. Punt d'interrupció 2, 0x000000000040052a a main () a test.c:3 3 int main() { 1: i = 2: f = 3: h = (void *) 0x0 4: main = {int ()} 0x400526 5: i =
Això farà que el depurador salti a la ubicació de memòria de la segona línia de codi en funció principal
. Tingueu en compte que aquí vaig saltar de l'inici de la ubicació principal a la segona ubicació directament. Per tant, variable i
mai s'ha establert, cosa que fa que el depurador llança un error que no pot accedir al contingut de la memòria a l'adreça de la variable i
.
Aquestes són algunes de les ordres bàsiques que us poden ajudar a començar a depurar un fitxer executable a Linux. Esperem que la informació d'aquesta pàgina sigui útil.