GNU Debugger este folosit pentru a depana un program, pentru a analiza blocarea sau pentru a vedea ce face programul la un anumit punct. A fost dezvoltat de Proiectul GNU în anii 1980 și a fost unul dintre cele mai utilizate programe de depanare în linia de comandă, precum și unul dintre cele mai populare software GNU.
Să scriem mai întâi un mic program C pe care apoi îl vom depana. Pentru a începe, creați unul nou .c
fișier folosind vim
sau orice editor la alegere:
test vim.c
Creați următorul program C:
#include int main() { int i = 5; float f = 5,5 i = i + 3; f = f + 2,2; printf("Valoarea lui i și f sunt: %d și %f\n", i, f); returnează 0; }
presa Evadare
pentru a accesa modul de comandă vim. Apoi tastați :wq
pentru a salva programul și a ieși.
Compilați și vedeți dacă programul rulează:
gcc test.c -o test ./test Valoarea lui i și f sunt: 8 și 7,700000
Pentru a activa suportul de depanare într-un program, o compilam cu -g
steag. Dacă indicatorul nu este utilizat, utilizatorul poate încă depana programul, deși cu opțiuni limitate.
test gcc.c -g -o test
Pentru a începe depanarea fișierul nostru executabil Test
în gdb
, noi fugim:
test gdb
Se va deschide gdb
consola, unde puteți tasta gdb
comenzi. Pentru a vedea o listă de comenzi, utilizați Ajutor
comanda.
$(gdb) help Lista claselor de comenzi: aliasuri -- Aliasuri ale altor comenzi puncte de întrerupere -- Oprirea programului în anumite puncte date -- Examinarea fișierelor de date -- Specificarea și examinarea fișierelor interne -- Comenzi de întreținere obscure -- Funcții obscure care rulează -- Rularea stivei de programe -- Examinarea stării stivei -- Asistență pentru întrebări de stare -- Puncte de urmărire a facilităților de asistență -- Urmărirea execuției programului fără oprirea programului definit de utilizator -- Comenzi definite de utilizator Tastați „help” urmat de un nume de clasă pentru o listă de comenzi din acea clasă. Tastați „help all” pentru lista tuturor comenzilor. Tastați „ajutor” urmat de numele comenzii pentru documentația completă. Tastați „apropos word” pentru a căuta comenzi legate de „word”. Abrevierile numelor de comandă sunt permise dacă nu sunt ambigue.
Puteți apoi să tastați ajutor class_name
pentru a vedea comenzile aparținând acelei clase. Pentru a căuta comenzi folosind un subșir, utilizați apropos subșir
.
Pentru a seta un punct de întrerupere când programul intră într-o funcție, alerga:
$(gdb) break main
Aici setăm un punct de întrerupere la singura funcție din codul nostru, adică. principal
. Utilizați comanda alerga
pentru a executa programul până la următorul punct de întrerupere sau până la ieșire.
$(gdb) rulează
Pentru a seta un punct de întrerupere într-o anumită locație dintr-o funcție, utilizare:
pauză *principal + 4
Acest lucru va configura un punct de întrerupere la a patra linie a funcției principale.
Acum, pentru a trece peste fluxul programului la următoarea linie de cod, pur și simplu rulați Etapa
comanda.
$(gdb) pasul 5: float f = 5,5;
Pentru a afișa conținutul unei variabile, alerga afişa
.
$(gdb) afișați i 6: i = 5
Pentru a modifica conținutul unei variabile, care ar putea fi necesar pentru a analiza rularea unui program sub anumite valori ale unei variabile, rulați set variabilă =Expresie
.
$(gdb) setare variabilă i=10 $(gdb) afișare i 7: i = 10
Aici, „Expresia” poate fi orice expresie validă (aritmetică/logică). Din motive de simplitate, atribuim o altă valoare (10) variabilei i
.
Pentru a imprima codul de asamblare pentru program, utilizați comanda dezasamblați numele funcției
:
Folosiți doar dezasambla
pentru a tipări codul de asamblare pentru întregul program. Observați săgeata de la o anumită linie din codul de asamblare. Indică faptul că sesiunea de depanare este în prezent întreruptă în acea locație de memorie specială (adică, acea linie de cod).
Pentru a trece depanatorul la o anumită linie de cod, alerga:
$(gdb) jump *principal + 2 Continuând la 0x400528. Punct de întrerupere 2, 0x000000000040052a în main () la test.c:3 3 int main() { 1: i = 2: f = 3: h = (void *) 0x0 4: main = {int ()} 0x400526 5: i =
Acest lucru va face ca depanatorul să sară la locația de memorie a celei de-a doua rânduri de cod în funcție principal
. Rețineți că aici am sărit de la începutul locației principale la a doua locație directă. Prin urmare, variabilă i
nu a fost niciodată setat, ceea ce duce la o eroare de depanare care nu poate accesa conținutul memoriei la adresa variabilei i
.
Acestea sunt câteva dintre comenzile de bază care vă pot ajuta să începeți cu depanarea unui fișier executabil în Linux. Sperăm că informațiile de pe această pagină sunt utile.