沒有使用過gdb調試過程序的覺得gdb是個很神奇的東東,如果你使用它調試一次保證你想忘記它都難,下面看看它的廬山真面目吧!
GDB概述GDB是GNU開源組織發布的一個強大的UNIX下的程序調試工具。或許,各位比較喜歡那種圖形界面方式的,像VC、BCB等IDE的調試,但如果你是在UNIX平台下做軟件,你會發現GDB這個調試工具有比VC、BCB的圖形化調試器更強大的功能。所謂“寸有所長,尺有所短”就是這個道理。
一般來說,GDB主要幫忙你完成下面四個方面的功能:
1、啟動你的程序,可以按照你的自定義的要求隨心所欲的運行程序。
2、可讓被調試的程序在你所指定的調置的斷點處停住。(斷點可以是條件表達式)
3、當程序被停住時,可以檢查此時你的程序中所發生的事。
4、動態的改變你程序的執行環境。
從上面看來,GDB和一般的調試工具沒有什麼兩樣,基本上也是完成這些功能,不過在細節上,你會發現GDB這個調試工具的強大,大家可能比較習慣了圖形化的調試工具,但有時候,命令行的調試工具卻有著圖形化工具所不能完成的功能。讓我們一一看來。
#include<iostream> using namespace std; int sum(int arg1,int arg2) { return arg1+arg2; } int main() { int a=1; int b=2; cout<<"sum = "<<sum(a,b)<<endl; return 0; }第一步:編譯
[root@localhost CppProject]# g++ -g sum.cpp -o sum
查看下文件
第二步:使用gdb設置斷點調試
[root@localhost CppProject]# gdb sum
(gdb) l 1 #include<iostream> 2 using namespace std; 3 int sum(int arg1,int arg2) 4 { 5 return arg1+arg2; 6 } 7 int main() 8 { 9 int a=1; 10 int b=2; (gdb) 11 cout<<"sum = "<<sum(a,b)<<endl; 12 return 0; 13 14 } (gdb)在第11行設置斷點
(gdb) break 11
Breakpoint 1 at 0x8048742: file sum.cpp, line 11.
直接在函數名處設置斷點
(gdb) break sum
Breakpoint 2 at 0x80486a7: file sum.cpp, line 5.
查看已設置斷點信息
(gdb) info break
Num Type Disp Enb Address What
1 breakpoint keep y 0x08048742 in main at sum.cpp:11
2 breakpoint keep y 0x080486a7 in sum(int, int) at sum.cpp:5
運行:
(gdb) run
Starting program: /root/CppProject/sum
Breakpoint 1, main () at sum.cpp:11
11 cout<<"sum = "<<sum(a,b)<<endl;
查看代碼:
(gdb) l
(gdb) l 1 #include<iostream> 2 using namespace std; 3 int sum(int arg1,int arg2) 4 { 5 return arg1+arg2; 6 } 7 int main() 8 { 9 int a=1; 10 int b=2; (gdb) 11 cout<<"sum = "<<sum(a,b)<<endl; 12 return 0; 13 14 } (gdb)(gdb) n表示next單步進行
Breakpoint 1, main () at sum.cpp:11
11 cout<<"sum = "<<sum(a,b)<<endl;
(gdb) n
sum = 3
12 return 0;
(gdb)
gdb下查看變量的值:p 變量名
(gdb) p a
$1 = 1
(gdb) p b
$2 = 2
查看函數內存地址:
(gdb) p sum
$3 = {int (int, int)} 0x80486a4 <sum(int, int)>
(gdb) p sum(a,b)
$4 = 3
調用函數
(gdb) p sum(100,200)
$5 = 300
斷點調試就這麼多了,有興趣的可以學習設置觀察點,捕捉點調試。