GNU atkļūdotājs tiek izmantots, lai atkļūdotu programmu, analizētu avāriju vai redzētu, ko programma dara noteiktā brīdī. To izstrādāja GNU projekts 1980. gados, un tas ir bijis viens no visplašāk izmantotajiem komandrindas atkļūdotājiem, kā arī viena no populārākajām GNU programmām.
Vispirms uzrakstīsim nelielu C programmu, kuru pēc tam atkļūdosim. Lai sāktu, izveidojiet jaunu .c
failu izmantojot vim
vai jebkurš redaktors pēc jūsu izvēles:
vim tests.c
Izveidojiet šādu C programmu:
#include int main() { int i = 5; pludiņš f = 5,5 i = i + 3; f = f + 2,2; printf("I un f vērtība ir: %d un %f\n", i, f); atgriezties 0; }
Nospiediet Bēgt
lai pārietu uz vim komandu režīmu. Pēc tam ierakstiet :wq
lai saglabātu programmu un izietu.
Kompilējiet un pārbaudiet, vai programma darbojas:
gcc test.c -o test ./test i un f vērtība ir: 8 un 7,700000
Lai programmā iespējotu atkļūdošanas atbalstu, mēs to apkopojam ar -g
karogs. Ja karodziņš netiek izmantots, lietotājs joprojām var atkļūdot programmu, lai gan ar ierobežotām iespējām.
gcc test.c -g -o tests
Lai sāktu atkļūdošanu mūsu izpildāmais fails pārbaude
iekšā gdb
, mēs skrienam:
gdb tests
Tas atvērs gdb
konsole, kurā varat ierakstīt gdb
komandas. Lai skatītu komandu sarakstu, izmantojiet palīdzēt
komandu.
$(gdb) help Komandu klašu saraksts: pseidonīmi -- Citu komandu pārtraukumpunktu aizstājvārdi -- Programmas apturēšana noteiktos datu punktos -- Datu failu pārbaude -- Failu iekšējo elementu norādīšana un pārbaude -- Apkopes komandas neskaidras -- Neskaidras funkcijas darbojas -- Programmas steka palaišana -- Steka statusa pārbaude -- Statusa vaicājumu atbalsts -- Atbalsta aprīkojuma izsekošanas punkti -- Programmas izpildes izsekošana bez programmas apturēšanas lietotāja definētas -- Lietotāja definētas komandas Ierakstiet "help", kam seko klases nosaukums lai iegūtu šīs klases komandu sarakstu. Ierakstiet "help all", lai parādītu visu komandu sarakstu. Lai iegūtu pilnu dokumentāciju, ierakstiet "help", kam seko komandas nosaukums. Ierakstiet "apropos word", lai meklētu komandas, kas saistītas ar "word". Komandu nosaukumu saīsinājumi ir atļauti, ja tie ir nepārprotami.
Pēc tam varat rakstīt palīdzības klases_nosaukums
lai redzētu komandas, kas pieder šai klasei. Lai meklētu komandas, izmantojot apakšvirkni, izmantojiet apropos apakšvirkne
.
Lai iestatītu pārtraukuma punktu, kad programma ievada funkciju, palaist:
$(gdb) break main
Šeit mēs iestatām pārtraukuma punktu mūsu koda vienīgajai funkcijai, t.i. galvenais
. Izmantojiet komandu palaist
lai izpildītu programmu līdz nākamajam pārtraukuma punktam vai līdz izejai.
$(gdb) palaist
Lai iestatītu pārtraukuma punktu noteiktā funkcijas vietā, izmantot:
pārtraukums *galvenais + 4
Tas iestatīs pārtraukuma punktu funkcijas galvenās 4. rindā.
Tagad lai pārietu pāri programmas plūsmai uz nākamo koda rindiņu, vienkārši palaidiet solis
komandu.
$(gdb) 5. solis: pludiņš f = 5,5;
Lai parādītu mainīgā saturu, palaist displejs
.
$(gdb) displejs i 6: i = 5
Lai mainītu mainīgā saturu, kas varētu būt nepieciešami, lai analizētu programmas izpildi ar noteiktām mainīgā, palaišanas vērtībām iestatīt mainīgo =Izteiksme
.
$(gdb) iestatīt mainīgo i=10 $(gdb) displejs i 7: i = 10
Šeit “Izteiksme” var būt jebkura derīga (aritmētiskā/loģiskā) izteiksme. Vienkāršības labad mainīgajam vienkārši piešķiram citu vērtību (10). i
.
Lai izdrukātu programmas montāžas kodu, izmantot komandu izjaukt funkcijas nosaukums
:
Izmantojiet tikai izjaukt
lai izdrukātu montāžas kodu visai programmai. Ņemiet vērā bultiņu noteiktā montāžas koda rindā. Tas norāda, ka atkļūdošanas sesija pašlaik ir apturēta konkrētajā atmiņas vietā (t.i., šajā koda rindā).
Lai pārietu uz atkļūdotāju noteiktā koda rindā, palaist:
$(gdb) lēciens *main + 2 Turpinās ar 0x400528. 2. pārtraukuma punkts, 0x000000000040052a galvenajā () vietnē test.c:3 3 int main() { 1: i = 2: f = 3: h = (void *) 0x0 4: main = {int ()} 0x400526 5: i =
Tas liks atkļūdotājam pārlēkt uz funkcijas 2. koda rindiņas atmiņas vietu galvenais
. Ņemiet vērā, ka šeit es pārlēcu no galvenās vietas sākuma uz tieši otro vietu. Līdz ar to mainīgs i
nekad netika iestatīts, kā rezultātā atkļūdotājs rada kļūdu, ka tas nevar piekļūt atmiņas saturam mainīgā adresē i
.
Šīs ir dažas no pamata komandām, kas var palīdzēt jums sākt ar izpildāmā faila atkļūdošanu operētājsistēmā Linux. Mēs ceram, ka šajā lapā sniegtā informācija jums noderēs.