gdb常用命令

gdb是gcc的交互式調(diào)試器。

假設(shè)程序文件是a.c,內(nèi)容是(這個程序有錯誤):

#include <stdio.h>

int j;

int main (void)

{? ?

 const int data[5] = {1, 2, 3, 4, 5};? ?

 int i, sum;? ?

 for (i = 0; i >= 0; ++i)? ?

  sum += data[i];? ?

 printf ("sum = %i\n", sum);? ?

 return 0;

}

則進(jìn)入gdb去調(diào)試a.c的方法是:

gcc -g a.c

gdb a.exe

屏幕上出現(xiàn):

GNU gdb (GDB) 7.6.1

Copyright (C) 2013 Free Software Foundation, Inc

.License GPLv3+: GNU GPL version 3 or later

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 "mingw32".

For bug reporting instructions, please see:...

Reading symbols from D:\常用目錄\hdf\c\test\a.exe...done.

(gdb)

(gdb)是gdb提示符,光標(biāo)停留在它后面閃爍。

以后就可以輸入gdb調(diào)試命令了。

下面介紹幾個常用的命令:這些命令大部分都可以簡寫為其首字母。

1 run

運(yùn)行程序,它在錯誤處會停下來,并顯示錯誤。

上面的程序,運(yùn)行run后得到下面的顯示:

(gdb) run

Starting program: D:\\hdf\c\test/a.exe

[New Thread 15976.0x2d6c]

[New Thread 15976.0x62a4]

Program received signal SIGSEGV, Segmentation fault.

0x00401474 in main () at a.c:8

8? ? ? ? ? sum += data[i];

(gdb)

指出第8行出現(xiàn)錯誤

2 list

顯示指定行數(shù)的語句

(gdb) list 8

3? ? ? int main (void)

4? ? ? {

5? ? ? ? ? const int data[5] = {1, 2, 3, 4, 5};

6? ? ? ? ? int i, sum;

7? ? ? ? ? for (i = 0; i >= 0; ++i)

8? ? ? ? ? sum += data[i];

9? ? ? ? ? printf ("sum = %i\n", sum);

10? ? ? ? ? return 0;

11? ? ? }

(gdb)

這個命令也可以指定行數(shù)范圍

如:

(gdb) list 1,5

1? ? ? #include <stdio.h>

2? ? ? int j;

3? ? ? int main (void)

4? ? ? {

5? ? ? ? ? const int data[5] = {1, 2, 3, 4, 5};

在前面執(zhí)行了list命令后,簡單回車相當(dāng)于執(zhí)行l(wèi)ist 10

10是默認(rèn)的顯示行數(shù),可以通過命令listsize來改變。

前面執(zhí)行了list命令后,可以用list +,list -來顯示前面和后面的語句,+,-后面還可以跟參數(shù)。

可以指定函數(shù)名來顯示整個函數(shù):

(gdb) list main

1? ? ? #include <stdio.h>

2? ? ? int j;

3? ? ? int main (void)

4? ? ? {

5? ? ? ? ? const int data[5] = {1, 2, 3, 4, 5};

6? ? ? ? ? int i, sum;

7? ? ? ? ? for (i = 0; i >= 0; ++i)

8? ? ? ? ? sum += data[i];

9? ? ? ? ? printf ("sum = %i\n", sum);

10? ? ? ? ? return 0;

(gdb)

3 print <變量名>

這個命令也可以縮寫成p

可以加參數(shù) /x輸出16進(jìn)制的值。

(gdb) print sum

$1 = 326244545

gdb用 $n標(biāo)識其輸出的變量,以后可以用它來引用。

(gdb) print i

$2 = 197691

這個命令的輸出,清楚地看出數(shù)組越界。程序的下標(biāo)最大到4,這里程序停止時,已經(jīng)到了197691。

命令的參數(shù)也可以是數(shù)組名:

(gdb) print data

$3 = {1, 2, 3, 4, 5}

也可以是數(shù)組元素:

(gdb) print data[0]

$4 = 1

4 set var <變量>=<表達(dá)式>

(gdb) set var i=5

(gdb) print i

$5 = 5

(gdb)

(gdb) set var i=i*2

(gdb) print i

$6 = 10

(gdb)

(gdb) set var i=$5+5

(gdb) print i

$7 = 10

(gdb)

可以用 函數(shù)名::變量名 的格式來指稱局部變量,如:

(gdb) print main::i

$8 = 10

(gdb)

全局變量用 '文件名’::變量名來指稱

(gdb) print 'a.c'::j

$9 = 0

(gdb)

現(xiàn)在展示輸出16進(jìn)制數(shù)值:

(gdb) set var i=90

(gdb) p /x i

$10 = 0x5a

(gdb)

5 break

這個命令設(shè)置中斷點(diǎn)。

可以跟三種參數(shù):行號,函數(shù)名,文件名:函數(shù)名。

6 continue

設(shè)置了中斷點(diǎn),則用run執(zhí)行程序,到中斷點(diǎn)就停下來。我們在此時可以檢查、改變變量的值。

如果要繼續(xù)執(zhí)行,則執(zhí)行continue命令。

continue命令執(zhí)行后,要顯示將要執(zhí)行的語句。

7 step

步進(jìn)命令。

可以跟參數(shù),參數(shù)表示要執(zhí)行幾行語句,沒有參數(shù)表示一行。

如果一行有多個語句,則執(zhí)行一行意味著執(zhí)行全部這幾個語句。如果一個語句被分成幾行,則執(zhí)行一行就是執(zhí)行整個語句。

可以在執(zhí)行continue的地方執(zhí)行步進(jìn)命令。

step命令執(zhí)行后,要顯示將要執(zhí)行的語句。

8 info locals

顯示所有的局部變量

9 info break

顯示所有的中斷點(diǎn)。

10 clear

刪除中斷點(diǎn)

可以跟兩種參數(shù):行號,函數(shù)名。

參數(shù)為行號,則刪除指定行號處的中斷點(diǎn)。

參數(shù)為函數(shù)名,則刪除在指定函數(shù)入口處的中斷點(diǎn)。

這個命令不能簡寫為c,因?yàn)閏ontinue已經(jīng)簡寫為c了。

但可以簡寫為cl,cle,clea

11 backtrace

顯示調(diào)用棧

可以簡寫為bt。

12 help

列出所有命令的類別

可以跟參數(shù):命令類別,命令。

如果參數(shù)是命令類別,則顯示該類別的所有命令。

如果參數(shù)是命令,則顯示該命令的說明。

13 quit

退出gdb


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容