標籤:
Linux gdb調試
沒有使用過gdb調試過程式的覺得gdb是個很神奇的東東,如果你使用它調試一次保證你想忘記它都難,下面看看它的廬山真面目吧!
GDB概述
GDB是GNU開源組織發布的一個強大的UNIX下的程式調試工具。或許,各位比較喜歡那種圖形介面方式的,像VC、BCB等IDE的調試,但如果你是在UNIX平台下做軟體,你會發現GDB這個調試工具有比VC、BCB的圖形化調試器更強大的功能。所謂“寸有所長,尺有所短”就是這個道理。
一般來說,GDB主要幫忙你完成下面四個方面的功能:
1、啟動你的程式,可以按照你的自訂的要求隨心所欲的運行程式。
2、可讓被調試的程式在你所指定的調置的斷點處停住。(斷點可以是條件運算式)
3、當程式被停住時,可以檢查此時你的程式中所發生的事。
4、動態改變你程式的執行環境。
從上面看來,GDB和一般的調試工具沒有什麼兩樣,基本上也是完成這些功能,不過在細節上,你會發現GDB這個調試工具的強大,大家可能比較習慣了圖形化的調試工具,但有時候,命令列的調試工具卻有著圖形化工具所不能完成的功能。讓我們一一看來。
| 1234567891011121314 |
#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; } |
第一步:編譯
[[email protected] CppProject]# g++ -g sum.cpp -o sum
查看下檔案
第二步:使用gdb設定斷點調試
[[email protected] CppProject]# gdb sum
| 1234567891011121314151617 |
(gdb) l1 #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;1314 }(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) l1 #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;1314 }(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)psum(a,b)3=int(int,int)0x80486a4<sum(int,int)>(gdb)psum(a,b)4 = 3
調用函數
(gdb) p sum(100,200)
$5 = 300
斷點調試就這麼多了,有興趣的可以學習設定觀察點,捕捉點調試。
Linux gdb調試