Bash百寶箱 初識gdb

2021-07-02 16:26:24 字數 3849 閱讀 1545

gdb是什麼?在linux終端找man後,對gdb的描述如下——

/**********gdb**********/

gdb即the gnu debugger的縮寫。

gdb是一種除錯工具,使用gdb可以窺探乙個程式在執行時或者crash時的內部資訊,主要有以下四種功能:

1、啟動程式,按自定義的方式執行程式。

2、在特定條件下(即斷點處)stop程式。

3、程式stop時,檢查程式中所發生的事情。

4、改變程式執行環境,修正bug行為。

gdb可以除錯c/c++程式,如果gnu提供了fortran編譯器的話,也可以除錯fortran程式。在shell終端啟動gdb有多種方式,如下:

1、直接執行gdb而不帶任何引數

$ gdb

gnu gdb (gdb) 7.5.91.20130417-cvs-ubuntu

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 "showcopying"

and "show warranty" for details.

this gdb was configured as "x86_64-linux-gnu".

for bug reporting instructions, please see:

.(gdb)

2、帶引數執行gdb的幾種形式

$ gdb program

$ gdb program core

$ gdb program pid

program是可執行檔案,core是程式非法執行時coredump產生的檔案,對於服務程式可指定pid,這時gdb會自動attach上去。

下面是幾個常用的gdb命令:

break [file:]function

在(file檔案的)function函式上設定斷點。

run [arglist]

執行程式(可以指定執行引數arglist)。

bt即backtrace,顯示程式棧資訊。

print expr

顯示expr表示式的值。

c即continue,繼續執行程式,例如程式停在某個斷點之後。

next

程式停止後執行程式下一行,會跳過function。

edit [file:]function

在程式當前停止的地方檢視程式行。

list [file:]function

列印程式當前停止地方附近的文字。

step

程式停止後執行程式下一行,會進入function。

help[name]

顯示提示資訊,name是某個gdb命令。

quit

推出gdb。

/**********gdb**********/

下面以乙個具體的例子main.c作為示例。

// main.c#include int sum(int n) return ret;}int main(void)

在linux終端編譯main.c生成可執行檔案test,-g生成除錯資訊,-o制定可執行檔名:

$ gcc -g main.c -o test

用gdb啟動test:

$ gdb test

用list(縮寫為l)顯示sum函式的完整資訊:

(gdb) list sum

1         // main.c

2         #include

34         int sum(int n)

5        

按回車鍵繼續:

(gdb)

11          return ret;

12     }

1314     int main(void)

15    

22結束,再次按回車鍵會提示越界:

(gdb)

line number 23 out of range; main.c has 22 lines.

用break(縮寫為b)在程式第16行打斷點:

(gdb) break 16

breakpoint 1 at 0x400551: file main.c, line 16.

用b在程式sum函式處打斷點:

(gdb) b sum

breakpoint 2 at 0x40051b: file main.c, line 6.

用info(縮寫為i)檢視break斷點資訊:

(gdb) info break

num type disp enb address what

1 breakpoint keep y 0x0000000000400551 in main at main.c:16

2 breakpoint keep y 0x000000000040051b in sum at main.c:6

用run(縮寫為r)執行程式(停在了斷點處):

(gdb) run

starting program: /home/test

breakpoint1, main () at main.c:16

16            int n = 10;

用backtrace(縮寫為bt)檢視函式棧:

(gdb) backtrace

#0 main () at main.c:16

用next(縮寫為n)執行程式下一行:

(gdb) next

17             int result = sum(n);

用n執行程式下一行(又停在了斷點處):

(gdb) n

breakpoint 2, sum (n=10) at main.c:6

6            int ret = 0;

用n執行程式下一行:

(gdb) n

7             int i = 0;

用n執行程式下一行:

(gdb) n

8             for (i = 1; i <= n; ++i) {

用n執行程式下一行:

(gdb) n

9 ret += i;

用print(縮寫為p)列印某個變數的值:

(gdb) print ret

$1 = 1

用n執行程式下一行(從9行返回到了8行):

(gdb) n

8            for (i = 1; i <= n; ++i) {

用continue(縮寫為c)繼續執行程式(直到下乙個斷點或者程式結束):

(gdb) continue

continuing.

result = 55

[inferior 1 (process 5540) exited normally]

如果沒執行上面的continue命令,通過finish可結束當前函式:

(gdb) finish

run till exit from #0 sum (n=10) at main.c:9

0x0000000000400562 in main () at main.c:17

17     int result = sum(n);

value returned is $2 = 55

用quit(縮寫為q)退出gdb:

(gdb) quit

Bash百寶箱 shell變數及擴充套件

shell變數賦值語句為 name value 等號兩邊不能有空格,可以給shell變數追加內容 name value 取消shell變數的設定使用 unset name 例子如下。var 1 echo var 1 var 123 echo var 123 var 100 echo var 1231...

Bash百寶箱shell變數及擴充套件

shell變數賦值語句為 name value 等號兩邊不能有空格,可以給shell變數追加內容 name value 取消shell變數的設定使用 unset name 例子如下。var 1 echo var 1 var 123 echo var 123 var 100 echo var 1231...

Bash百寶箱 shell內建命令之冒號

在shell中,冒號 是乙個內建 builtin 命令,格式如下 arguments 冒號命令本身沒什麼 使用場景有限,一般用於引數擴充套件,有以下幾種用法 如果parameter沒有設定或者為空,替換為word 否則替換為parameter的值。如果parameter沒有設定或者為空,不進行任何替...