Difference between revisions of "GDB ar QUEMU"

From DiLab
Jump to: navigation, search
(Ports)
(DDD - grafiskais atkļūmotājs)
 
(22 intermediate revisions by the same user not shown)
Line 1: Line 1:
{{TocRight}}
Par šo stāstīts lekcijā "Programmu izstrādes vide".
Par šo stāstīts lekcijā "Programmu izstrādes vide".

Ņemiet verā, ka gdb vietā lietojami atkļūmotāji, kas atbalsta ARM, piemēram, '''arm-linux-gnueabi-gdb''' vai '''gdb-multiarch'''


==Ports==
==Ports==
Izvēlamies portu, pa kuru GBB runās ar QUEMU.
Izvēlamies portu, pa kuru GBB runās ar QEMU.
Vēlams ņemt savu identifikātoru + 20000.
Vēlams ņemt savu identifikātoru + 20000.
Šajos pierakstos piemēra pēc lietosim 21234, bet jums jālieto savs ports!
Šajos pierakstos piemēra pēc lietosim 21234, bet jums jālieto savs ports!
Line 20: Line 23:
2. Terminālā B: Startējam gdb
2. Terminālā B: Startējam gdb


arm-linux-gnueabi-gdb prog1
gdb-multiarch prog1


Kad gdb startējis un tas gaida komandas, kreisajā pusē redzams '(gdb)'.
Kad gdb startējis un tas gaida komandas, kreisajā pusē redzams '(gdb)'.
Line 27: Line 30:
(gdb) target remote localhost:21234
(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:
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. Programmas izvadu uz ekrāna var novērot terminālī A.


(gdb) continue
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.


Ieteikums vispirms pamēģināt visas 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. Dažas gdb komandas un to saīsinājumi doti zemākā nodaļā.


==GDB viena termināla režīmā==
==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.
Atkļū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.


1. startējam gdb, fonā:
1. Startējam gdb, fonā:


arm-linux-gnueabi-gdb prog1 &
gdb-multiarch prog1 &


2. Startējam quemu, arī fonā, norādot portu:
2. Startējam quemu, arī fonā, norādot portu:
Line 50: Line 53:
3. Paceļam gdb priekšplānā
3. Paceļam gdb priekšplānā


fg %arm-linux-gnueabi-gdb
fg %gdb-multiarch


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


target remote localhost:21234
target remote localhost:21234
Line 59: Line 62:


continue
continue


====Kopsavilkums vienā terminālī====
$ <span style=background:lightblue>qemu-arm -L /usr/arm-linux-gnueabi -g 12348 ./myprog &</span>
[3] 10027
$ <span style=background:lightblue>gdb-multiarch ./myprog</span>
GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./myprog...done.
(gdb) <span style=background:lightblue>target remote localhost:12348</span>
Remote debugging using localhost:12348
warning: remote target does not support file transfer, attempting to access files from local filesystem.
warning: Unable to find dynamic linker breakpoint function.
GDB will be unable to debug shared library initializers
and track explicitly loaded dynamic code.
0xff7bdc70 in ?? ()
(gdb)

== GDB Multiarch lietošana ==

Ar gdb-multiarch iespējams atkļūdot patvaļīgas arhitektūras izpildi.
Seko piemērs ARM programmām.

Installējam gdb-multiarch (ja vēl nav uz datora)
sudo apt install gdb-multiarch

Piedarbinam QEMU servera režīmā lai izpildītu programmu md1 (un parametru 10). Darbinam fonā (&):

qemu-arm -L /usr/arm-linux-gnueabi -g 12345 md1 10 &

Pieslēdzamies ar gdb pie servera:

gdb-multiarch md1
target remote localhost:12345

Tālāk varam lietot visas gdb komandas.


== GDB dažas komandas ==
== GDB dažas komandas ==
Line 67: Line 122:
| Apraksts
| Apraksts
|+
|+
| run
|
| Izpildīt programmu
|-
| continue
| continue
| c
| c
Line 94: Line 153:
* *adrese
* *adrese
*...un citi varianti
*...un citi varianti

|-
| list
| l
|
Rādīt pirmkodu. Kā parametru var norādīt funkcijas vārdu vai rindu kodā
|-
|-
| info registers
| info registers
Line 105: Line 170:
Uzstādot "on" vietā "off" šis režīms tiek atcelts.
Uzstādot "on" vietā "off" šis režīms tiek atcelts.
|}
|}

==Disasemblēšana==
Disasemblēšana ar radare2:

r2 -D gdb-multiarch gdb://localhost:12345 -d md1


==DDD - grafiskais atkļūmotājs==
==DDD - grafiskais atkļūmotājs==
Line 111: Line 181:
Tikai gdb vietā jālieto ddd:
Tikai gdb vietā jālieto ddd:


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



== Aliasi ātrākai izpildei ==
== Aliasi ātrākai izpildei ==
Line 124: Line 193:
id=$(($id+20000))
id=$(($id+20000))
echo "target remote 127.0.0.1:$id" > ~/.gdbinit
echo "target remote 127.0.0.1:$id" > ~/.gdbinit
(sleep 1; ddd --debugger arm-linux-gnueabi-gdb $1) &
(sleep 1; ddd --debugger gdb-multiarch $1) &
qemu-arm -g $id $@
qemu-arm -g $id $@
}
}

Latest revision as of 16:32, 3 November 2021

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

Ņemiet verā, ka gdb vietā lietojami atkļūmotāji, kas atbalsta ARM, piemēram, arm-linux-gnueabi-gdb vai gdb-multiarch

Ports

Izvēlamies portu, pa kuru GBB runās ar QEMU. Vēlams ņemt savu identifikātoru + 20000. Šajos pierakstos piemēra pēc lietosim 21234, 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

gdb-multiarch 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. Programmas izvadu uz ekrāna var novērot terminālī A.

continue

Ieteikums vispirms pamēģināt visas 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. Dažas gdb komandas un to saīsinājumi doti zemākā nodaļā.

GDB viena termināla režīmā

Atkļū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ā:

gdb-multiarch prog1 &

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

qemu-arm -g 21234 prog1 &

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

fg %gdb-multiarch 

4. No gdb vides savienojam gdb ar qemu 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


Kopsavilkums vienā terminālī

$ qemu-arm -L /usr/arm-linux-gnueabi -g 12348 ./myprog &
[3] 10027

$ gdb-multiarch ./myprog

GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./myprog...done.

(gdb)  target remote localhost:12348
Remote debugging using localhost:12348
warning: remote target does not support file transfer, attempting to access files from local  filesystem.
warning: Unable to find dynamic linker breakpoint function.
GDB will be unable to debug shared library initializers
and track explicitly loaded dynamic code.
0xff7bdc70 in ?? ()

(gdb)

GDB Multiarch lietošana

Ar gdb-multiarch iespējams atkļūdot patvaļīgas arhitektūras izpildi. Seko piemērs ARM programmām.

Installējam gdb-multiarch (ja vēl nav uz datora)

sudo apt install gdb-multiarch 

Piedarbinam QEMU servera režīmā lai izpildītu programmu md1 (un parametru 10). Darbinam fonā (&):

qemu-arm -L /usr/arm-linux-gnueabi -g 12345 md1 10 &

Pieslēdzamies ar gdb pie servera:

gdb-multiarch md1
target remote localhost:12345

Tālāk varam lietot visas gdb komandas.

GDB dažas komandas

GDB komanda Īsais variants Apraksts
run Izpildīt programmu
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
list l

Rādīt pirmkodu. Kā parametru var norādīt funkcijas vārdu vai rindu kodā

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.

Disasemblēšana

Disasemblēšana ar radare2:

r2 -D gdb-multiarch gdb://localhost:12345 -d md1

DDD - grafiskais atkļūmotājs

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

ddd --debugger gdb-multiarch 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 gdb-multiarch $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"