一。gdb除錯工具簡介
gdb(gnu debugger)是gcc的除錯工具。其功能強大,現描述如下:
gdb主要幫忙你完成下面四個方面的功能:
1.啟動你的程式,可以按照你的自定義的要求隨心所欲的執行程式。
2.可讓被除錯的程式在你所指定的調置的斷點處停住。(斷點可以是條件表示式)
3.當程式被停住時,可以檢查此時你的程式中所發生的事。
4.動態的改變你程式的執行環境。
gdb除錯工具使用必須在應用程式編譯時生成除錯資訊 gcc新增 -g引數
[root@cdh2 vc]# gcc -g hello.c -o hello
gcc常用命令行表
help:檢視命令幫助,具體命令查詢在gdb中輸入help + 命令,簡寫h
start:單步執行,執行程式,停在第一執行語句
list:檢視原**(list-n,從第n行開始檢視**。list+ 函式名:檢視具體函式),簡寫l
set:設定變數的值
next:單步除錯(逐過程,函式直接執行),簡寫n
step:單步除錯(逐語句:跳入自定義函式內部執行),簡寫s
backtrace:檢視函式的呼叫的棧幀和層級關係,簡寫bt
frame:切換函式的棧幀,簡寫f
info:檢視函式內部區域性變數的數值,簡寫i
finish:結束當前函式,返回到函式呼叫點
continue:繼續執行,簡寫c
quit:退出gdb,簡寫q
break 10 某行下斷點
break test.c:10 某個檔案某行下斷點
break main 某個方法上下斷點
break test.c:main 某個檔案某個方法
如果想在指定的位址設定斷點,比如在main函式的位址出設斷點。
可用info add main 獲得main的位址如0x80484624,然後用break *0x80484624.
條件斷點就是在如上述指定斷點的同時指定進入斷點的條件。
例如:(假如有int 型別變數 index)
break 10 if index == 3
info breakpoints:檢視當前設定的所有斷點
delete breakpoints num:刪除第num個斷點,簡寫d
display:追蹤檢視具體變數值
undisplay:取消追蹤觀察變數
watch:被設定觀察點的變數發生修改時,列印顯示
i watch:顯示觀察點
enable breakpoints:啟用斷點
disable breakpoints:禁用斷點
x:檢視記憶體x/20xw 顯示20個單元,16進製制,4位元組每單元
run argv[1] argv[2]:除錯時命令列傳參
set follow-fork-mode child#makefile專案管理:選擇跟蹤父子程序(fork())
core檔案:先用$ ulimit -c 1024 開啟core,當程式出錯會自動生成core檔案。除錯時 gdb a.out core
二。gdb除錯小案例
新增檔案編寫以下**
#include int add(int i,int j)
void main()
帶除錯資訊編譯
[root@cdh2 vc]# gcc -g hello1.c hello1
開啟檔案
gdb hello1 自動進入gdb命令列
main方法和第9行下斷點
b main
b 9
檢視所有斷點
(gdb) info b
num type disp enb address what
1 breakpoint keep y 0x00000000004005a2 in main at hello1.c:9
2 breakpoint keep y 0x00000000004005a2 in main at hello1.c:9
開始執行run 發現在main方法上自動斷下了 並且下一行執行第9行
(gdb) run
starting program: /root/vc/hello1
breakpoint 1, main () at hello1.c:9
9 printf("helloworld\n");
missing separate debuginfos, use: debuginfo-install glibc-2.17-157.el7_3.5.x86_64
next表示下一步執行 存在子方法直接跳過 輸出了第9行的helloworld 下一次next執行第10行
n
helloworld
10 int k=add(10,100);
step表示下一步執行 存在子方法自動進入子方法
(gdb) s
add (i=10, j=100) at hello1.c:5 下一步執行add第5行
5 int result=i+j;
(gdb) s 執行 result應該有結果了
6 return result;
(gdb) print result print列印result的值
$2 = 110
輸入finish 完成子函式的呼叫回到父函式main中
(gdb) finish
run till exit from #0 add (i=10, j=100) at hello1.c:6
0x00000000004005bb in main () at hello1.c:10
10 int k=add(10,100);
value returned is $3 = 110
輸入 continue 執行 如果後面還有斷點 段下來 沒有直接執行結束了
(gdb) c
continuing.
110[inferior 1 (process 7134) exited with code 03]
linux下c程式設計起步學習 掌握gcc基本用法
初學時最好從命令列入手,這樣可以熟悉從編寫程式 編譯 除錯和執行的整個過程。編寫程式可以用vi或其它編輯器編寫。編譯則使用gcc命令。要往下學習首先就得熟悉gcc命令的用法。gcc命令提供了非常多的命令選項,但並不是所有都要熟悉,初學時掌握幾個常用的就可以了,到後面再慢慢學習其它選項,免得因選項太多...
linux下c程式設計起步 掌握gcc基本用法
初學時最好從命令列入手,這樣可以熟悉從編寫程式 編譯 除錯和執行的整個過程。編寫程式可以用vi vim 個人覺得vim比vi好用 或其它編輯器編寫。編譯則使用gcc命令。要往下學習首先就得熟悉gcc命令的用法。gcc命令提供了非常多的命令選項,但並不是所有都要熟悉,初學時掌握幾個常用的就可以了,到後...
linux下gcc程式設計03 make工程管理
一。make工程管理器簡介 工程管理器是指管理較多的檔案。如果有乙個上百個檔案的 構成的專案,如果其中只有乙個或少數幾個檔案進行了修改,按照之前所學的gcc編譯工具,就不得不把這所有的檔案重新編譯一遍,因為編譯器並不知道哪些檔案是最近更新的,而只知道需要包含這些檔案才能把源 編譯成可執行檔案,於是,...