Paano Gamitin ang GNU Debugger sa Linux

Ang GNU Debugger ay ginagamit upang i-debug ang isang programa, upang suriin ang pag-crash, o upang makita kung ano ang ginagawa ng programa sa isang partikular na punto. Ito ay binuo ng GNU Project noong 1980s at naging isa sa pinakamalawak na ginagamit na command line debuggers pati na rin ang isa sa pinakasikat na GNU software.

Magsulat muna tayo ng isang maliit na C program na ating ide-debug. Upang makapagsimula, gumawa ng bago .c file gamit ang vim o anumang editor na iyong pinili:

pagsubok ng vim.c

Lumikha ng sumusunod na C program:

#include int main() { int i = 5; lumutang f = 5.5 i = i + 3; f = f + 2.2; printf("Ang halaga ng i at f ay: %d at %f\n", i, f); bumalik 0; }

Pindutin tumakas upang pumunta sa vim command mode. Pagkatapos ay i-type :wq upang i-save ang program at lumabas.

I-compile at tingnan kung tumatakbo ang program:

gcc test.c -o test ./test Ang halaga ng i at f ay: 8 at 7.700000

Upang paganahin ang suporta sa pag-debug sa isang programa, pinagsama-sama namin ito -g bandila. Kung hindi ginagamit ang bandila, maaari pa ring i-debug ng user ang program, kahit na may limitadong mga opsyon.

gcc test.c -g -o test

Upang simulan ang pag-debug ang aming maipapatupad na file pagsusulit sa gdb, tumakbo kami:

pagsubok ng gdb

Bubuksan nito ang gdb console, kung saan maaari mong i-type ang gdb mga utos. Para makakita ng listahan ng mga command gamitin ang tulong utos.

$(gdb) help Listahan ng mga klase ng mga command: mga alias -- Mga alyas ng iba pang mga breakpoint ng command -- Pagpapahinto ng program sa ilang partikular na mga punto ng data -- Pagsusuri ng mga file ng data -- Pagtukoy at pagsusuri sa mga file sa loob -- Nakatago ang mga command sa pagpapanatili -- Mga hindi nakikitang feature na tumatakbo -- Pagpapatakbo sa stack ng program -- Pagsusuri sa status ng stack -- Suporta sa mga katanungan sa status -- Mga tracepoint ng mga pasilidad ng suporta -- Pagsubaybay sa pagpapatupad ng program nang hindi humihinto sa program na tinukoy ng gumagamit -- Mga command na tinukoy ng user I-type ang "help" na sinusundan ng pangalan ng klase para sa isang listahan ng mga utos sa klase na iyon. I-type ang "help all" para sa listahan ng lahat ng command. I-type ang "help" na sinusundan ng command name para sa buong dokumentasyon. I-type ang "apropos word" para maghanap ng mga command na nauugnay sa "word". Pinapayagan ang mga pagdadaglat ng pangalan ng command kung hindi malabo.

Maaari mo nang i-type tulong class_name upang makita ang mga utos na kabilang sa klase na iyon. Upang maghanap ng mga command gamit ang isang substring, gamitin apropos substring.

Upang magtakda ng breakpoint kapag pumasok ang program sa isang function, tumakbo:

$(gdb) break main

Dito nagtakda kami ng breakpoint sa nag-iisang function sa aming code, i.e. pangunahing. Gamitin ang utos tumakbo upang isagawa ang programa hanggang sa susunod na breakpoint, o hanggang exit.

$(gdb) tumakbo

Upang magtakda ng breakpoint sa isang partikular na lokasyon sa isang function, gamitin:

break *main + 4

Magse-set up ito ng breakpoint sa ika-4 na linya ng function main.

ngayon, upang lampasan ang daloy ng programa sa susunod na linya ng code, patakbuhin lang ang hakbang utos.

$(gdb) hakbang 5: float f = 5.5;

Upang ipakita ang mga nilalaman ng isang variable, tumakbo display .

$(gdb) display i 6: i = 5

Upang baguhin ang mga nilalaman ng isang variable, na maaaring kailanganin upang suriin ang pagtakbo ng isang programa sa ilalim ng mga partikular na halaga ng isang variable, run itakda ang variable = Expression.

$(gdb) set variable i=10 $(gdb) display i 7: i = 10

Dito, ang 'Expression' ay maaaring maging anumang wastong (aritmetika / lohikal) na expression. Para sa kapakanan ng pagiging simple, nagtatalaga lang kami ng isa pang halaga (10) sa variable i.

Upang i-print ang assembly code para sa programa, gumamit ng utos i-disassemble ang functionname:

Gamitin lang kalasin upang i-print ang assembly code para sa buong programa. Tandaan ang arrow sa isang partikular na linya sa assembly code. Isinasaad nito na ang sesyon ng pag-debug ay kasalukuyang naka-pause sa partikular na lokasyon ng memorya (ibig sabihin, ang linya ng code na iyon).

Upang tumalon sa debugger sa isang partikular na linya ng code, tumakbo:

$(gdb) jump *main + 2 Nagpapatuloy sa 0x400528. Breakpoint 2, 0x000000000040052a sa pangunahing () sa pagsubok.c:3 3 int main() { 1: i = 2: f = 3: h = (void *) 0x0 4: main = {int ()} 0x400526 5: i = 

Gagawin nitong tumalon ang debugger sa lokasyon ng memorya ng ika-2 linya ng code sa function pangunahing. Tandaan na dito ako tumalon mula sa simula ng pangunahing patungo sa direktang pangalawang lokasyon. Samakatuwid, variable i ay hindi kailanman naitakda, na nagreresulta sa error sa paghahagis ng debugger na hindi nito ma-access ang mga nilalaman ng memorya sa address ng variable i.

Ito ang ilan sa mga pangunahing utos na makakatulong sa iyong magsimula sa pag-debug ng isang executable na file sa Linux. Umaasa kaming nakatulong ang impormasyon sa pahinang ito.