Uzlabojiet koda kvalitāti un novērsiet negaidītus rezultātus, iemācoties izmantot GNU atkļūdotāju, lai atklātu nevēlamas kļūdas savā kodā.
Atkļūdošana ir neaizstājama programmētāju un drošības pētnieku prasme. Spēcīga izpratne par atkļūdošanu ļauj saprast izpildāmo failu zemākā līmenī un uztvert visas slēpjamās kļūdas.
GNU atkļūdotājs jeb GDB ir mūžīgs atkļūdošanas rīks, uz kuru programmētāji ir paļāvušies jau gadiem ilgi. Lūk, kā izmantot GDB operētājsistēmā Linux.
Programmu paraugu sagatavošana
Lai izpētītu GDB funkcijas, jums būs nepieciešams izpildāmais fails, ar kuru eksperimentēt. Demonstrācijai jūs palaižat GDB atslēgu pārbaudes programmā vienreiz ar pieejamu avota kodu un atkļūdošanas simboliem, vienreiz bez. pirmkods un vienkārša daudzpavedienu programma, kas uz ekrāna drukā ziņojumus, gan rakstītus C valodā, gan kompilētus ar GCC (GNU C Kompilators).
Jūs varat izmantojiet jebkuru citu C kompilatoru bet pārliecinieties, ka binārā fails netiek noņemts.
Visticamāk, jūs darbosit GDB savās programmās. Tāpēc noteikti apkopojiet tos ar
-g atzīmējiet ar gcc, lai iespējotu atkļūdošanas simbolus.Bez atkļūdošanas simboliem un ar stipri noņemtu bināro failu, jums būs jāatkļūdo programmas izjaukšana. Tam būs nepieciešama spēcīga montāžas valodas izpratne un kā atmiņas piešķiršana darbojas operētājsistēmā Linux lai saprastu kaudzē un reģistros esošos datus.
Programmas palaišana GDB
Jūs palaižat programmu GDB vairākos veidos. Vai nu ierakstiet gdb , un, kad tas ir ielādēts, ierakstiet palaist. Vai arī sāciet gdb un pēc tam izmantojiet failu komandu, ielādējiet bināro failu gdb un pēc tam izpildiet to ar palaist komandu.
Ja programmai ir nepieciešami komandrindas argumenti, lai tā darbotos pareizi, noteikti pievienojiet argumentus aiz programmas nosaukuma. Lūk, sintakse programmas ielādei GDB un tās izpildei ar argumentiem:
gdb
run
Vai:
gdb
file
run
Pārtraukuma punktu iestatīšana, izmantojot GDB
Atkļūdošanas pārtraukuma punkti ir manuāli iestatīti stingri kodi, kas aptur izpildes plūsmu, kad programma sasniedz pārtraukuma punktu. Pārtraukuma punktu iestatīšana ļauj pārlūkot kodu un pārbaudīt, kā katrs izpildes posms ietekmē datus un mainīgos.
Izmantojot GDB, atkļūdojot programmu ar atkļūdošanas simboliem, varat iestatīt pārtraukuma punktu pēc funkcijas nosaukuma vai iestatīt pārtraukuma punktu, pamatojoties uz rindas numuru. Lūk, sintakse:
break main
break 47
Lai skatītu visus pašreizējās atkļūdošanas sesijas pārtraukumpunktus, ierakstiet:
info breakpoints
Lai dzēstu noteiktu pārtraukuma punktu vai vairākus pārtraukuma punktus, ierakstiet:
delete 2
delete 3-5
GDB arī ļauj iestatīt nosacījumu pārtraukuma punktus, kas nozīmē, ka programma tiks apturēta tikai tad, ja izpildes laikā tiks izpildīts konkrēts nosacījums. Tās var būt mainīgā lieluma vērtības izmaiņas vai neveiksmīgs funkcijas izsaukums vai jebkas, ko vēlaties. Tālāk ir norādīta sintakse nosacījuma pārtraukuma punktu iestatīšanai.
break if n == 2
Ja vēlaties turpināt programmas izpildi pēc pārtraukuma punkta sasniegšanas, ierakstiet Turpināt komanda:
continue
Pārkāpšana caur kodu
Koda ievadīšana ir ļoti svarīga, lai saprastu, kā programma apstrādā datus. Pārbaudot dažādas programmas funkcijas un pārbaudot datu stāvokli, varat iegūt labāku izpratni par to, kā programma ievieš kodā ierakstīto loģiku.
Tas arī palīdz atklāt avāriju cēloni un studiju programmas uzvedību ar ķirurģisku precizitāti, jo varat pārvietoties cauri katrai koda rindiņai, kā vēlaties. GDB varat izmantot kodu trīs galvenajos veidos:
- solis: Šī komanda liek GDB pāriet uz nākamo avota faila rindu. Tas ļauj būtībā šķērsot avota koda garumu rindiņu pa rindiņai.
- Nākamais: Šī komanda izpilda nākamo avota koda rindiņu pašreizējās funkcijas ietvaros un pēc tam apstājas. Nākamais traktē funkciju kā vienu rindiņu, tādēļ, ja lietojat nākamo pirms funkcijas izsaukšanas, tā uzskatīs to par vienu rindiņu un pārkāps tai, atšķirībā no solis komandu.
- pabeigt: Pabeigšanas komanda izpilda visas atlikušās rindas pašreizējā funkcijā un pēc tam apstājas.
Mainīgo lielumu pārbaude
Pārejot cauri kodam, jūs vēlaties pārbaudīt mainīgo vērtību, lai redzētu, kā programmas loģika tos maina. Šeit ir sintakse, lai skatītu mainīgo vērtību GDB:
print
Ja vēlaties izdrukāt mainīgā lieluma izmaiņas katru reizi, kad tas tiek atjaunināts, izmantojiet displeja komandu. Tas ir īpaši noderīgi, ja vēlaties izsekot un izdrukāt mainīgā vērtību cilpā:
display
Uzraudzības punktu iestatīšana
Uzraudzības punkti un nosacījuma pārtraukuma punkti ir cieši saistīti, jo tie abi reaģē uz izmaiņām programmā. Uzraudzības punkti tiek izmantoti, lai izsekotu koda datu izmaiņām. Piemēram, jūs varētu vēlēties, lai programma pārtrauktu ikreiz, kad mainās mainīgā vērtība. Lūk, kā to izdarīt, izmantojot GDB:
watch
Pavedieniem specifiska atkļūdošana, izmantojot GDB
GDB ļauj veikt pavedienam raksturīgu atkļūdošanu, strādājot ar daudzpavedienu programmām. Demonstrēšanai mēs strādāsim ar vienkāršu C programmu, kas izmanto četrus pavedienus, lai drukātu ziņojumus ar katru pavedienu.
Lai programmā skatītu pašlaik izveidotos pavedienus, izmantojiet info komanda:
info threads
Lai strādātu ar noteiktu pavedienu, varat to atlasīt sarakstā, izmantojot tā indeksa numuru. Piemēram:
thread 2
Pēc pavediena atlasīšanas varat iziet cauri tā izpildes plūsmai, izmantojot solis, Nākamais, un pabeigt komandas, kā parādīts iepriekš.
Attālā atkļūdošana, izmantojot GDB
Varat arī attālināti atkļūdot programmas, kas atrodas citā sistēmā. Lai to izdarītu, mērķa mašīnā ir jāiestata gdbserver. Varat to viegli instalēt, izmantojot sava izplatīšanas noklusējuma pakotņu pārvaldnieku vai citi jūsu instalētie pakotņu pārvaldnieki jūsu sistēmā.
Piemēram, lai instalētu gdbserver savās Ubuntu vai Debian sistēmās, izmantojiet APT:
sudo apt install gdbserver
Kad esat instalējis, pārvietojieties uz binārā faila mapi un palaidiet šo komandu, lai palaistu gdbserver:
gdbserver :
gdbserver ir jāatgriež izvade, ka tā ir izveidota un klausās jūsu definētajā portā. Tagad klienta datorā palaidiet GDB un pēc tam izveidojiet savienojumu ar attālo serveri, izmantojot mērķis komanda:
target remote :
GDB skriptu rakstīšana, lai automatizētu atkļūdošanu
GDB ļauj programmētājiem rakstīt GDB skriptus, kas automātiski izpildīs GDB komandas. Tas ļoti palīdz, ja mēģināt atkļūdot vienu un to pašu koda daļu vairākas reizes. Tā vietā, lai iestatītu pārtraukuma punktu, izietu cauri kodam un drukātu mainīgās vērtības katru reizi, kad ielādējat bināro failu, varat izmantot GDB skriptu, lai automatizētu visu procesu.
Šeit ir piemērs:
set logging enabled on
set logging file sample.out
break main
command 1
backtrace
print N
continue
end
quit
Iepriekš minētajā skriptā jūs sakāt GDB iespējot reģistrēšanu un saglabāt žurnālu failā ar nosaukumu sample.out, pēc tam iestatiet pārtraukuma punktu pie galvenais funkciju.
Pārtraukuma punktam 1, šajā gadījumā pārtraukuma punktam galvenajā funkcijā, palaidiet šādas komandas: izsekot atpakaļ, drukāt, Turpināt. Būtībā GDB vispirms izpildīs atpakaļizsekošanu, pēc tam izdrukā mainīgā "N" vērtību, turpinās izpildi un visbeidzot izies.
Lai izpildītu šo skriptu, izmantojiet:
gdb -x