Linux 包含了一個叫 gdb 的 GNU 調(diào)試程序. gdb 是一個用來調(diào)試 C 和 C++ 程序的強力調(diào)試器. 它使你能在程序運行時觀察程序的內(nèi)部結(jié)構(gòu)和內(nèi)存的使用情況. 以下是 gdb 所提供的一些功能:
1、啟動你的程序,可以按照你的自定義的要求隨心所欲的運行程序。
2、可讓被調(diào)試的程序在你所指定的調(diào)置的斷點處停住。(斷點可以是條件表達式)
3、當程序被停住時,可以檢查此時你的程序中所發(fā)生的事。
4、動態(tài)的改變你程序的執(zhí)行環(huán)境。
當你啟動
gdb 后, 你能在命令行上指定很多的選項. 可以以下面的方式來運行
gdb gdb <fname>
當你用這種方式運行
gdb , 你能直接指定想要調(diào)試的程序. 這將告訴
gdb 裝入名為 fname 的可執(zhí)行文件. 你也可以用
gdb 去檢查一個因程序異常終止而產(chǎn)生的 core 文件, 或者與一個正在運行的程序相連. 你可以參考
gdb 指南頁或在命令行上鍵入
gdb -h 得到一個有關(guān)這些選項的說明的簡單列表.
為調(diào)試編譯代碼
為了使
gdb 正常工作, 你必須使你的程序在編譯時包含調(diào)試信息. 調(diào)試信息包含你程序里的每個變量的類型和在可執(zhí)行文件里的地址映射以及源代碼的行號.
gdb 利用這些信息使源代碼和機器碼相關(guān)聯(lián).
在編譯時用 -g 選項打開調(diào)試選項.
命 令 |
描 述 |
file |
裝入想要調(diào)試的可執(zhí)行文件. |
kill |
終止正在調(diào)試的程序. |
list |
列出產(chǎn)生執(zhí)行文件的源代碼的一部分. |
next |
執(zhí)行一行源代碼但不進入函數(shù)內(nèi)部. |
step |
執(zhí)行一行源代碼而且進入函數(shù)內(nèi)部. |
run |
執(zhí)行當前被調(diào)試的程序 |
quit |
終止 gdb |
watch |
使你能監(jiān)視一個變量的值而不管它何時被改變. |
break |
在代碼里設(shè)置斷點, 這將使程序執(zhí)行到這里時被掛起. |
make |
使你能不退出 gdb 就可以重新產(chǎn)生可執(zhí)行文件. |
shell |
使你能不離開 gdb 就執(zhí)行 UNIX shell 命令. |
(a)設(shè)置斷點
break 20;---在第20行設(shè)置斷點
break func;---在函數(shù)func的入口處設(shè)置斷點
(b)取消斷點
delete break 20;---取消第20行的斷點
delete break func;---取消函數(shù)func入口處的斷點
(c)運行代碼
run;
r;
(d)顯示變量或函數(shù)值
display;
p;
(e)單步執(zhí)行
next;
n;
(f)跳步執(zhí)行
step;
s;
(g)循環(huán)執(zhí)行
continue;
c;
(h)列出運行棧內(nèi)容
bt;
一個調(diào)試示例
——————
源程序:tst.c
1 #include <stdio.h>
2
3 int func(int n)
4 {
5 int sum=0,i;
6 for(i=0; i<n; i++)
7 {
8 sum+=i;
9 }
10 return sum;
11 }
12
13
14 main()
15 {
16 int i;
17 long result = 0;
18 for(i=1; i<=100; i++)
19 {
20 result += i;
21 }
22
23 printf("result[1-100] = %d \n", result );
24 printf("result[1-250] = %d \n", func(250) );
25 }
編譯生成執(zhí)行文件:(Linux下)
cc -g tst.c -o tst
使用GDB調(diào)試:
gdb tst <---------- 啟動GDB
GNU gdb 5.1.1
Copyright 2002 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-SuSE-linux"...
(gdb) l <-------------------- l命令相當于list,從第一行開始例出原碼。
1 #include <stdio.h>
2
3 int func(int n)
4 {
5 int sum=0,i;
6 for(i=0; i<n; i++)
7 {
8 sum+=i;
9 }
10 return sum;
(gdb) <-------------------- 直接回車表示,重復(fù)上一次命令
11 }
12
13
14 main()
15 {
16 int i;
17 long result = 0;
18 for(i=1; i<=100; i++)
19 {
20 result += i;
(gdb) break 16 <-------------------- 設(shè)置斷點,在源程序第16行處。
Breakpoint 1 at 0x8048496: file tst.c, line 16.
(gdb) break func <-------------------- 設(shè)置斷點,在函數(shù)func()入口處。
Breakpoint 2 at 0x8048456: file tst.c, line 5.
(gdb) info break <-------------------- 查看斷點信息。
Num Type Disp Enb Address What
1 breakpoint keep y 0x08048496 in main at tst.c:16
2 breakpoint keep y 0x08048456 in func at tst.c:5
(gdb) r <--------------------- 運行程序,run命令簡寫
Starting program: /home/hchen/test/tst
Breakpoint 1, main () at tst.c:17 <---------- 在斷點處停住。
17 long result = 0;
(gdb) n <--------------------- 單條語句執(zhí)行,next命令簡寫。
18 for(i=1; i<=100; i++)
(gdb) n
20 result += i;
(gdb) n
18 for(i=1; i<=100; i++)
(gdb) n
20 result += i;
(gdb) c <--------------------- 繼續(xù)運行程序,continue命令簡寫。
Continuing.
result[1-100] = 5050 <----------程序輸出。
Breakpoint 2, func (n=250) at tst.c:5
5 int sum=0,i;
(gdb) n
6 for(i=1; i<=n; i++)
(gdb) p i <--------------------- 打印變量i的值,print命令簡寫。
$1 = 134513808
(gdb) n
8 sum+=i;
(gdb) n
6 for(i=1; i<=n; i++)
(gdb) p sum
$2 = 1
(gdb) n
8 sum+=i;
(gdb) p i
$3 = 2
(gdb) n
6 for(i=1; i<=n; i++)
(gdb) p sum
$4 = 3
(gdb) bt <--------------------- 查看函數(shù)堆棧。
#0 func (n=250) at tst.c:5
#1 0x080484e4 in main () at tst.c:24
#2 0x400409ed in __libc_start_main () from /lib/libc.so.6
(gdb) finish <--------------------- 退出函數(shù)。
Run till exit from #0 func (n=250) at tst.c:5
0x080484e4 in main () at tst.c:24
24 printf("result[1-250] = %d \n", func(250) );
Value returned is $6 = 31375
(gdb) c <--------------------- 繼續(xù)運行。
Continuing.
result[1-250] = 31375 <----------程序輸出。
Program exited with code 027. <--------程序退出,調(diào)試結(jié)束。
(gdb) q <--------------------- 退出gdb。
posted on 2008-04-18 15:51
一凡 閱讀(495)
評論(0) 編輯 收藏 所屬分類:
Linux C