Difference between revisions of "GDB ar QUEMU"

From DiLab
Jump to: navigation, search
(GDB dažas komandas)
(GDB termināla režīmā)
Line 6: Line 6:
Šajos pierakstos piemēra pēc lietosim 1234, bet jums jālieto savs ports!
Šajos pierakstos piemēra pēc lietosim 1234, bet jums jālieto savs ports!


== Atkļūdošana ar GDB divos terminālos==
==GDB termināla režīmā==

Atkļūdošana varētu būt ērtaka, ja jūs atverat divus terminālus: vienu emulatoram qemu, un otru atkļūmotājam gdb. Tad atkļūdošanas scenārijs ir sekojošs:

1. Terminālā A: piedarbinam qemu ar jūsu nokompilēto programmu prog1 klausīšanās režīmā, norādot unikālu portu 21234. Portu ieteicams izvēlēties tā, lai tas nesakrīt ar kolēģu portiem, piemēram, cipars '2'un četri jūsu apliecības cipari, piemēram, '1234''

qemu-arm -g 21234 prog1

Pievēršu uzmanību, ka, iespējams, jums jānorāda quemu arī atbalstošo bibliotēku atrašanās vietu:

qemu-arm -g 21234 -L /usr/arm-linux-gnueabi prog1

2. Terminālā B: Startējam gdb

arm-linux-gnueabi-gdb prog1

Kad gdb startējis un tas gaida komandas, kreisajā pusē redzams '(gdb)'.
Ievadam komandu noradot adresi un portu, kur pieslēgties no gdb uz qemu:

(gdb) target remote localhost:21234
3. Tagad varam veikt atkļūmošanu no Termināļa B ar gdb komandām, piemēram, continue, breakpoint, step, next, info registers un citām:

(gdb) continue

Ieteikums visupirms pamēģināt programmas izpildi ar continue, tad ielādēt to no jauna un uzstādīt breakpoint uz kādu asemblera funkcijas vai iezīmes vārdu, tad darbināt līdz tai ar continue, tad apskatīt reģistru saturu ar info registers, un turpināt ar step vai next pēc vajadzības vērojot kā mainās reģistru saturs ar info registers.


==GDB viena termināla režīmā==

Atķļūmot iespējams arī darot visu vienā termināli, vienīgi jums jāpiestartē attiecīgās programmas "fonā" ar '&'palīdzību. Un pareizajos brīžos pārceļot programmu no fona priekšplānā ar 'fg'- foreground komandu.


Pieņemsim, ka vēlaties atkļūmot savu programmu prog1.
Pieņemsim, ka vēlaties atkļūmot savu programmu prog1.
Line 16: Line 46:
2. Startējam quemu, arī fonā, norādot portu:
2. Startējam quemu, arī fonā, norādot portu:


qemu-arm -g 1234 prog1 &
qemu-arm -g 21234 prog1 &


3. Paceļam gdb priekšplānā
3. Paceļam gdb priekšplānā
Line 24: Line 54:
4. No gdb vides sasienam gdb ar quemu lietojot to pašu portu
4. No gdb vides sasienam gdb ar quemu lietojot to pašu portu


target remote localhost:1234
target remote localhost:21234


5. Izpildam gdb komandas atkļūmošanai: continue, step, next, break, delete, info registers un tamlīdzīgi.
5. Izpildam gdb komandas atkļūmošanai: continue, step, next, break, delete, info registers un tamlīdzīgi.


continue
continue



== GDB dažas komandas ==
== GDB dažas komandas ==

Revision as of 16:59, 18 March 2015

Par šo stāstīts lekcijā "Programmu izstrādes vide".

Ports

Izvēlamies portu, pa kuru GBB runās ar QUEMU. Vēlams ņemt savu identifikātoru + 20000. Šajos pierakstos piemēra pēc lietosim 1234, bet jums jālieto savs ports!

Atkļūdošana ar GDB divos terminālos

Atkļūdošana varētu būt ērtaka, ja jūs atverat divus terminālus: vienu emulatoram qemu, un otru atkļūmotājam gdb. Tad atkļūdošanas scenārijs ir sekojošs:

1. Terminālā A: piedarbinam qemu ar jūsu nokompilēto programmu prog1 klausīšanās režīmā, norādot unikālu portu 21234. Portu ieteicams izvēlēties tā, lai tas nesakrīt ar kolēģu portiem, piemēram, cipars '2'un četri jūsu apliecības cipari, piemēram, '1234

qemu-arm -g 21234 prog1

Pievēršu uzmanību, ka, iespējams, jums jānorāda quemu arī atbalstošo bibliotēku atrašanās vietu:

qemu-arm -g 21234 -L /usr/arm-linux-gnueabi prog1

2. Terminālā B: Startējam gdb

arm-linux-gnueabi-gdb prog1

Kad gdb startējis un tas gaida komandas, kreisajā pusē redzams '(gdb)'. Ievadam komandu noradot adresi un portu, kur pieslēgties no gdb uz qemu:

(gdb) target remote localhost:21234

3. Tagad varam veikt atkļūmošanu no Termināļa B ar gdb komandām, piemēram, continue, breakpoint, step, next, info registers un citām:

(gdb) continue

Ieteikums visupirms pamēģināt programmas izpildi ar continue, tad ielādēt to no jauna un uzstādīt breakpoint uz kādu asemblera funkcijas vai iezīmes vārdu, tad darbināt līdz tai ar continue, tad apskatīt reģistru saturu ar info registers, un turpināt ar step vai next pēc vajadzības vērojot kā mainās reģistru saturs ar info registers.


GDB viena termināla režīmā

Atķļūmot iespējams arī darot visu vienā termināli, vienīgi jums jāpiestartē attiecīgās programmas "fonā" ar '&'palīdzību. Un pareizajos brīžos pārceļot programmu no fona priekšplānā ar 'fg'- foreground komandu.

Pieņemsim, ka vēlaties atkļūmot savu programmu prog1.

1. startējam gdb, fonā:

arm-linux-gnueabi-gdb prog1 &

2. Startējam quemu, arī fonā, norādot portu:

qemu-arm -g 21234 prog1 &

3. Paceļam gdb priekšplānā

fg %arm-linux-gnueabi-gdb 

4. No gdb vides sasienam gdb ar quemu lietojot to pašu portu

target remote localhost:21234

5. Izpildam gdb komandas atkļūmošanai: continue, step, next, break, delete, info registers un tamlīdzīgi.

continue

GDB dažas komandas

GDB komanda Īsais variants Apraksts
continue c Turpināt (sākt) programmas izpildi
step s Izpildīt tekošo komandu rindu pirmkodā. Ja tajā ir funkciju izsaukumi, iet iekšā un apstāties tur.


Var būt papildus parametrs n, kas norada cik reizes tā darīt.

next n Izpildīt tekošo komandu rindu pirmkodā. Ja gadās funkcijas izsaukums, izpildīt funkciju bez apstāšanās.

Var būt papildus parametrs n, kas norada cik reizes tā darīt.

break <x> b <x>

Uzstādīt "breakpoint" uz <x>, kur <x> var būt:

  • rindas_numurs tekošajā pirmkoda failā
  • fails:rindas_numurs
  • funkcijas_vārds
  • fails:funkcijas_vārds
  • *adrese
  • ...un citi varianti
info registers i r Reģistru saturs. Var pielikt klāt reģistra nosaukumu.
set step mode on Uzstādīt režīmu, kurā ar "step" iet iekšā arī kodā, par kuru nav atkļūdošanas (debug) informācijas.

Uzstādot "on" vietā "off" šis režīms tiek atcelts.

DDD - grafiskais atkļūmotājs

Līdzīgi kā iepriekšējais. Tikai gdb vietā jālieto ddd:

ddd --debugger arm-linux-gnueabi-gdb prog1 &


Aliasi ātrākai izpildei

Viens veids, ka vienkāršot palaišanu ir uztaisīt aliasa komandu un ievietot to .bash_alias failā. Piemeram, ddd atkļūmotājam to varētu darīt šādi:

function debug()
{
   id=‘id -u‘
   id=$(($id+20000))
   echo "target remote 127.0.0.1:$id" > ~/.gdbinit
   (sleep 1; ddd --debugger arm-linux-gnueabi-gdb $1) &
   qemu-arm -g $id $@
}

Tad pēc .bash_alias izpildes (kas vienmēr notiek arī ielogojoties terminālī) vares palaist debugeri vienkarši ar "debug prog1"