linux下gcc程式設計02 gdb除錯工具使用

2021-08-28 21:15:45 字數 3319 閱讀 8737

一。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編譯工具,就不得不把這所有的檔案重新編譯一遍,因為編譯器並不知道哪些檔案是最近更新的,而只知道需要包含這些檔案才能把源 編譯成可執行檔案,於是,...