Linux編程基礎——GDB(查看資料)

來源:互聯網
上載者:User

查看棧資訊

當程式被停住了,首先要確認的就是程式是在哪兒被斷住的。這個一般是通過查看調用棧資訊來看的。在gdb中,查看調用棧的命令是backtrace,可以簡寫為bt。

    (gdb) bt
    #0 pop () at stack.c:10
    #1 0x080484a6 in main () at main.c:12

也可以通過info stack命令實作類別似的功能(我更喜歡這個命令):

    (gdb) info stack
    #0 pop () at stack.c:10
    #1 0x080484a6 in main () at main.c:12

查看來源程式

當程式斷住是,gdb會顯示當前斷點的位置:

    Breakpoint 1, pop () at stack.c:10
    10 return stack[top--];

可以用list命令來查看當前斷點附近的程式的原始碼:

    (gdb) list
    5 int top = -1;
    6
    7
    8 char pop(void)
    9 {
    10 return stack[top--];
    11 }
    12
    13 void push(char c)
    14 {

list命令後面還可以更一些參數,來顯示更多功能:

  • <linenum>    行號。
  • <+> [offset]    當前行號的正位移量。
  • <-> [offset]     當前行號的負位移量。
  • <filename:linenum> 檔案的中的行行。
  • <function>             函數的代碼
  • <filename:function>     檔案中的函數。
  • <*address> 程式運行時的語句在記憶體中的地址。

不過,就算有這些資訊,查看代碼仍然不大方便。現在新版的gdb都帶一個tui的功能,可以通過focus命令開啟,其主要介面如下:

這個介面比起list來說方便多了,能高亮當前語句的執行位置,步進時也會跟著變化,有點使用Turbo C的感覺。

不知道是不是由於focus比較新的緣故,貌似網上並沒有多少文章介紹它,雖然它比較容易上手,但也有不少可以介紹的地方,限於篇幅我這裡就不做更多的說明,感興趣的朋友可以看下gdb的gui用法這篇文章。

查看運行時資料

gdb中查看變數的命令是print,一般用它的簡寫形式p。它的文法如下:

    print [</format>] <expr>

其中參數expr可以是一個變數,也可以是運算式。format表示輸出格式,例如,可以用/x來將結果按16進位輸出。如下是幾個基本的例子:

    (gdb) p top
    $16 = 1
    (gdb) p &top
    $17 = (int *) 0x804a014 <top>
    (gdb) p 3+2*5
    $18 = 13
    (gdb) p /x 3+2*5
    $19 = 0xd

format的取值範圍有如下幾種:

  • x 按十六進位格式顯示變數。
  • d 按十進位格式顯示變數。
  • u 按十六進位格式顯示無符號整型。
  • o 按八進位格式顯示變數。
  • t 按二進位格式顯示變數。
  • a 按十六進位格式顯示變數。
  • c 按字元格式設定顯示變數。
  • f 按浮點數格式顯示變數。

查看函數傳回值

查看函數傳回值是在調試的過程中經常遇到的需求。例如,對於如下函數

    int foo()
    {
        return 100;
    }

我們可以以如下方式擷取函數的傳回值:

1. 通過finish命令運行至函數結束,此時會列印函數傳回值。

    (gdb) finish
    Run till exit from #0 foo () at main.c:9
    main () at main.c:15
    15 }
    Value returned is $2 = 100

2. 傳回值會儲存在eax寄存器中,通過查看資訊可以擷取傳回值。

    (gdb) p $eax
    $3 = 100

    (gdb) info registers

    eax 0x64 100

查看連續記憶體

可以使用GDB的"@"操作符查看連續記憶體,"@"的左邊是第一個記憶體的地址的值,"@"的右邊則你你想查看記憶體的長度。

例如,對於如下代碼:int arr[] = {2, 4, 6, 8, 10};,可以通過如下命令查看arr前三個單元的資料。

    (gdb) p *arr@3
    $2 = {2, 4, 6}

查看記憶體

可以使用examine命令(簡寫為x)來查看記憶體位址中的值。x命令的文法如下所示:

    x /<n/f/u> <addr>

  • n 表示顯示記憶體的長度,也就是說從當前地址向後顯示幾個地址的內容。
  • f 表示顯示的格式,如果是字串,則用s,如果是數字,則可以用i。
  • u 表示從當前地址往後請求的位元組數,預設是4個bytes。(b單位元組,h雙位元組,w四位元組,g八位元組)
  • <addr> 表示一個記憶體位址。

例如:以兩位元組為單位顯示前面的那個數組的地址後32位元組記憶體資訊如下.

    (gdb) x /16uh arr
    0xbffff4cc: 2 0 4 0 6 0 8 0
    0xbffff4dc: 10 0 34032 2052 0 0 0 0

自動顯示

在VisualStudio中,可以通過監看式視窗動態查看變數的值。在gdb中,也提供了類似的命令display,它的文法是:

    display <expr>
    display /<fmt> <expr>
    display /<fmt> <addr>

expr是一個運算式,fmt表示顯示的格式,addr表示記憶體位址。當你用display設定好了一個或多個運算式後,只要你的程式被停下來(單步跟蹤時),GDB會自動顯示你所設定的這些運算式的值。

幾個相關的命令如下:

  • undisplay <dnums...>        不顯示dispaly
  • delete display [dnums]    刪除自動顯示,不帶dnums參數則刪除所有自動顯示,也支援範圍刪除,如: delete display 1,3-5
  • disable display <dnums...>    使display失效
  • enable display <dnums...>    恢複display
  • info display        查看display資訊
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.