Linux中國

三步上手 GDB

調試 C 程序,曾讓我很困擾。然而當我之前在寫我的操作系統時,我有很多的 Bug 需要調試。我很幸運的使用上了 qemu 模擬器,它允許我將調試器附加到我的操作系統。這個調試器就是 gdb

我得解釋一下,你可以使用 gdb 先做一些小事情,因為我發現初學它的時候真的很混亂。我們接下來會在一個小程序中,設置斷點,查看內存。

1、 設斷點

如果你曾經使用過調試器,那你可能已經會設置斷點了。

下面是一個我們要調試的程序(雖然沒有任何 Bug):

#include <stdio.h>
void do_thing() {
    printf("Hi!n");
}
int main() {
    do_thing();
}

另存為 hello.c. 我們可以使用 dbg 調試它,像這樣:

bork@kiwi ~> gcc -g hello.c -o hello
bork@kiwi ~> gdb ./hello

以上是帶調試信息編譯 hello.c(為了 gdb 可以更好工作),並且它會給我們醒目的提示符,就像這樣:

(gdb)

我們可以使用 break 命令設置斷點,然後使用 run 開始調試程序。

(gdb) break do_thing 
Breakpoint 1 at 0x4004f8
(gdb) run
Starting program: /home/bork/hello 

Breakpoint 1, 0x00000000004004f8 in do_thing ()

程序暫停在了 do_thing 開始的地方。

我們可以通過 where 查看我們所在的調用棧。

(gdb) where
#0  do_thing () at hello.c:3
#1  0x08050cdb in main () at hello.c:6
(gdb) 

2、 閱讀彙編代碼

使用 disassemble 命令,我們可以看到這個函數的彙編代碼。棒級了,這是 x86 彙編代碼。雖然我不是很懂它,但是 callq 這一行是 printf 函數調用。

(gdb) disassemble do_thing
Dump of assembler code for function do_thing:
   0x00000000004004f4 <+0>:     push   %rbp
   0x00000000004004f5 <+1>:     mov    %rsp,%rbp
=> 0x00000000004004f8 <+4>:     mov    $0x40060c,%edi
   0x00000000004004fd <+9>:     callq  0x4003f0 
   0x0000000000400502 <+14>:    pop    %rbp
   0x0000000000400503 <+15>:    retq 

你也可以使用 disassemble 的縮寫 disas

3、 查看內存

當調試我的內核時,我使用 gdb 的主要原因是,以確保內存布局是如我所想的那樣。檢查內存的命令是 examine,或者使用縮寫 x。我們將使用x

通過閱讀上面的彙編代碼,似乎 0x40060c 可能是我們所要列印的字元串地址。我們來試一下。

(gdb) x/s 0x40060c
0x40060c:        "Hi!"

的確是這樣。x/s/s 部分,意思是「把它作為字元串展示」。我也可以「展示 10 個字元」,像這樣:

(gdb) x/10c 0x40060c
0x40060c:       72 &apos;H&apos;  105 &apos;i&apos; 33 &apos;!&apos;  0 &apos;00&apos;        1 &apos;01&apos;        27 &apos;33&apos;       3 &apos;03&apos;        59 &apos;;&apos;
0x400614:       52 &apos;4&apos;  0 &apos;00&apos;

你可以看到前四個字元是 Hi!,並且它們之後的是一些不相關的東西。

我知道 gdb 很多其他的東西,但是我仍然不是很了解它,其中 xbreak 讓我獲得很多。你還可以閱讀 do umentation for examining memory

via: https://jvns.ca/blog/2014/02/10/three-steps-to-learning-gdb/

作者:Julia Evans 譯者:Torival 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國