Cum să utilizați GNU Debugger în Linux

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.