GDB調試器用法

wiki頁:http://code.google.com/p/ldd6410/wiki/GDBDebug

gdb調試器用法

不論是調試Linux內核空間的驅動仍是調試用戶空間的應用程序,掌握gdb的用法都是必須。並且,調試內核和調試應用程序時使用的gdb命令是徹底相同的,下面以代碼清單22.2的應用程序爲例演示gdb調試器的用法。
1  int add(int a, int b)
2  {
3    return a + b;
4  }
5  
6  main()
7  {
8    int sum[10] =
9    {
10     0, 0, 0, 0, 0, 0, 0, 0, 0, 0    
11   }  ;
12   int i;
13  
14   int array1[10] =
15   {
16     48, 56, 77, 33, 33, 11, 226, 544, 78, 90
17   };
18   int array2[10] =
19   {
20     85, 99, 66, 0x199, 393, 11, 1, 2, 3, 4
21   };
22
23   for (i = 0; i < 10; i++)
24   {
25     sum[i] = add(array1[i], array2[i]);
26   }
27 }
[root@localhost driver_study]# gdb gdb_example
GNU gdb
Red Hat Linux (5.3post-0.20021129.18rh)
Copyright 2003 Free Software Foundation, Inc.
GDB
is free software, covered by the GNU General Public License, and you are
welcome to change it
and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...
(gdb)

一、list命令

(gdb) break add
Breakpoint 1 at 0x80482f7: file gdb_example.c, line 3.
(gdb) run  
Starting program: /driver_study/gdb_example

Breakpoint 1, add (a=48, b=85) at gdb_example.c:3
warning
: Source file is more recent than executable.

3         return a + b;
(gdb) next
4       }
(gdb) next
main
() at gdb_example.c:23
23        for (i = 0; i < 10; i++)
(gdb) next
25          sum[i] = add(array1[i], array2[i]);
(gdb) print sum
$1
= {133, 0, 0, 0, 0, 0, 0, 0, 0, 0}

二、run命令

set args 可指定運行時參數,如:set args 10 20 30 40 50;show args 命令能夠查看設置好的運行參數。 path <dir> 可設定程序的運行路徑;how paths可查看程序的運行路徑;set environment varname [=value]用於設置環境變量,如set env USER=baohua;show environment [varname]則用於查看環境變量。 cd <dir> 至關於shell的cd命令;pwd 顯示當前所在的目錄。 info terminal 用於顯示程序用到的終端的模式;gdb中也可使用重定向控制程序輸出,如run > outfile;tty命令能夠指定輸入輸出的終端設備,如:tty /dev/ttyS1

三、break命令

在進入指定函數時停住,C++中可使用class::function或function(type, type)格式來指定函數名。 在指定行號停住。 在當前行號的前面或後面的offset行停住,offiset爲天然數。 在源文件filename的linenum行處停住。 在源文件filename的function函數的入口處停住。 在程序運行的內存地址處停住。 break命令沒有參數時,表示在下一條指令處停住。 「...」能夠是上述的break <linenum>break +offset / break –offset中的參數,condition表示條件,在條件成立時停住。好比在循環體中,能夠設置break if i=100,表示當i爲100時停住程序。 查看斷點時,可以使用info命令,如info breakpoints [n]info break [n](n表示斷點號)。

四、單步命令

(gdb) break 25
Breakpoint 1 at 0x8048362: file gdb_example.c, line 25.
(gdb) run
Starting program: /driver_study/gdb_example

Breakpoint 1, main () at gdb_example.c:25
25          sum[i] = add(array1[i], array2[i]);
(gdb) step
add
(a=48, b=85) at gdb_example.c:3
3         return a + b;
單步跟蹤,若是有函數調用,它不會進入該函數。一樣地,next後面不加count表示一條條地執行,加表示執行後面的count條指令,而後再停住。 set step-mode on用於打開step-mode模式,這樣,在進行單步跟蹤時,程序不會由於沒有debug信息而不停住,這個參數的設置可便於查看機器碼。set step-mod off用於關閉step-mode模式。 運行程序,直到當前函數完成返回,並打印函數返回時的堆棧地址和返回值及參數值等信息。 一直在循環體內執行單步,退不出來是一件使人煩惱的事情,until命令能夠運行程序直到退出循環體。 stepi和nexti用於單步跟蹤一條機器指令,一條程序代碼有可能由數條機器指令完成,stepi和nexti能夠單步執行機器指令。 另外,運行「display/i $pc」命令後,單步跟蹤會在打出程序代碼的同時打出機器指令,即彙編代碼。

五、continue命令

continue [ignore-count]
c
[ignore-count]
fg
[ignore-count]
(gdb) continue
Continuing.
Hardware watchpoint 3: i

Old value = 2
New value = 3
0x0804838d in main () at gdb_example.c:23
23        for (i = 0; i < 10; i++)
(gdb) continue
Continuing.

Breakpoint 1, main () at gdb_example.c:25
25          sum[i] = add(array1[i], array2[i]);
(gdb) continue
Continuing.
Hardware watchpoint 3: i

Old value = 3
New value = 4
0x0804838d in main () at gdb_example.c:23
23        for (i = 0; i < 10; i++)

六、print命令

 print <expr>
 
print /<f> <expr>
<expr>是表達式,是被調試的程序中的表達式,<f>是輸出的格式,好比,若是要把表達式按16進制的格式輸出,那麼就是/x。在表達式中,有幾種GDB所支持的操做符,它們能夠用在任何一種語言中,「@」是一個和數組有關的操做符,「::」指定一個在文件或是函數中的變量,「{<type>} <addr>」表示一個指向內存地址<addr>的類型爲type的一個對象。
(gdb) print sum
$2
= {133, 155, 0, 0, 0, 0, 0, 0, 0, 0}
(gdb) next

Breakpoint 1, main () at gdb_example.c:25
25          sum[i] = add(array1[i], array2[i]);
(gdb) next
23        for (i = 0; i < 10; i++)
(gdb) print sum
$3
= {133, 155, 143, 0, 0, 0, 0, 0, 0, 0}
int *array = (int *) malloc (len * sizeof (int));
p *array@len
咱們可用display命令設置一些自動顯示的變量,當程序停住時,或是單步跟蹤時,這些變量會自動顯示。 若是要修改變量,如x的值,可以使用以下命令:
print x=4

七、watch命令

(gdb) watch i
Hardware watchpoint 3: i
(gdb) next
23        for (i = 0; i < 10; i++)
(gdb) next
Hardware watchpoint 3: i

Old value = 0
New value = 1
0x0804838d in main () at gdb_example.c:23
23        for (i = 0; i < 10; i++)
(gdb) next

Breakpoint 1, main () at gdb_example.c:25
25          sum[i] = add(array1[i], array2[i]);
(gdb) next
23        for (i = 0; i < 10; i++)
(gdb) next
Hardware watchpoint 3: i

Old value = 1
New value = 2
0x0804838d in main () at gdb_example.c:23
23        for (i = 0; i < 10; i++)

八、examine命令

x/<n/f/u> <addr> 
<addr>表示一個內存地址。「x/」後 的n、f、u都是可選的參數,n 是一個正整數,表示顯示內存的長度,也就是說從當前地址向後顯示幾個地址的內容;f 表示顯示的格式,若是地址所指的是字符串,那麼格式能夠是s,若是地址是指令地址,那麼格式能夠是i;u 表示從當前地址日後請求的字節數,若是不指定的話,GDB默認是4字節。u參數能夠被一些字符代替:b表示單字節,h表示雙字節,w表示四字節,g表示八 字節。當咱們指定了字節長度後,GDB會從指定的內存地址開始,讀寫指定字節,並把其看成一個值取出來。n、f、u這3個參數能夠一塊兒使用,例如命令「x/3uh 0x54320」表示從內存地址0x54320開始以雙字節爲1個單位(h)、16進制方式(u)顯示3個單位(3)的內存。

九、jump命令

通常來講,被調試程序會按照程序代碼的運行順序依次執行,可是GDB也提供了亂序執行的功能,也就是說,GDB能夠修改程序的執行順序,從而讓程序隨意跳躍。這個功能能夠由GDB的jump命令: jump <linespec> 來指定下一條語句的運行點。<linespec>能夠是文件的行號,能夠是file:line格式,也能夠是+num這種偏移量格式,表示下一條運行語句從哪裏開始。 jump <address> 這裏的<address>是代碼行的內存地址。 注意,jump命令不會改變當前的程序棧中的內容,因此,若是使用jump從一個函數跳轉到另外一個函數,當跳轉到的函數運行完返回,進行出棧操做時必然會發生錯誤,這可能致使意想不到的結果,因此最好只用jump在同一個函數中進行跳轉。

十、signal命令

十一、return命令

return
return <expression>

十二、call命令

1三、info命令

info命令能夠在調試時用來查看寄存器、斷點、觀察點和信號等信息。要查看寄存器的值,可使用以下命令: info registers (查看除了浮點寄存器之外的寄存器) info all-registers (查看全部寄存器,包括浮點寄存器) info registers <regname ...> (查看所指定的寄存器) 要查看斷點信息,可使用以下命令: info break 列出當前所設置的全部觀察點,使用以下命令: info watchpoints 查看有哪些信號正在被GDB檢測,使用以下命令: info signals info handle 也可使用info line命令來查看源代碼在內存中的地址。info line後面能夠跟行號、函數名、文件名:行號、文件名:函數名等多種形式,例以下面的命令會打印出所指定的源碼在運行時的內存地址:
info line tst.c:func

1四、disassemble

(gdb) disassemble func
Dump of assembler code for function func:
0x8048450 <func>:       push   %ebp
0x8048451 <func+1>:     mov    %esp,%ebp
0x8048453 <func+3>:     sub    $0x18,%esp
0x8048456 <func+6>:     movl   $0x0,0xfffffffc(%ebp)
...
End of assembler dump.
相關文章
相關標籤/搜索