GDB 多文件除錯設定及常用除錯命令

2021-06-22 18:21:24 字數 3591 閱讀 6269

1.多文件除錯設定:

以前用gdb除錯都只是除錯單個的檔案,在做dhcp二級relay的時候需要對整個工程進行gdb除錯,發現自己竟然不會!現在終於惡補上了,發到部落格上與大家分享。

載入可執行檔案進行gdb除錯。gdb demo

在main函式中斷點位置設定在分包函式這:b dhcrelay.c:362 (注意:這一行的位置是dispatch函式被呼叫的地方,而dispatch函式的實現在../common目錄下dispatch.c中)

同時需要在dispatch.c中的dispatch函式這裡設定乙個斷點,所以要將common目錄載入進來(之前一直不會除錯多檔案的原因就是不會這一行的命令):dir ../common

再檢視dispatch函式的行數:list dispatch.c:dispatch (可以看到dispatch函式在86行)

在dispatch函式這設定斷點:b dispatch.c:86

最後啟動程式,執行:run

注意:如果dispatch.c檔案跟dhcrelay.c檔案在同一目錄下,就不需要使用dir ../common來指定目錄了,在設好斷點後直接在gdb提示符後輸入s,然後回車,就可以進入到dispatch.c檔案中去了!!!

使用gdb除錯守護程序的時候會有問題

2.常用除錯命令:

呼叫gdb編譯需要在cc後面加 -g引數再加-o;

[root@redhat home]#gdb 除錯檔案:啟動gdb

(gdb) l :(字母l)從第一行開始列出原始碼

(gdb) break n :在第n行處設定斷點

(gdb) break func:在函式func()的入口處設定斷點

(gdb) info break: 檢視斷點資訊

(gdb) r:執行程式

(gdb) n:單步執行

(gdb) c:繼續執行

(gdb) p 變數 :列印變數的值

(gdb) bt:檢視函式堆疊

(gdb) finish:退出函式

(gdb) shell 命令列:執行shell命令列

(gdb) set args 引數:指定執行時的引數

(gdb) show args:檢視設定好的引數

(gdb) show paths:檢視程式執行路徑;

set environment varname [=value] 設定環境變數。如:set env user=hchen;

show environment [varname] 檢視環境變數;

(gdb) cd 相當於shell的cd;

(gdb)pwd :顯示當前所在目錄

(gdb)info program: 來檢視程式的是否在執行,程序號,被暫停的原因。

(gdb)clear 行號n:清除第n行的斷點

(gdb)delete 斷點號n:刪除第n個斷點

(gdb)disable 斷點號n:暫停第n個斷點

(gdb)enable 斷點號n:開啟第n個斷點

(gdb)step:單步除錯如果有函式呼叫,則進入函式;與命令n不同,n是不進入呼叫的函式的

list :簡記為 l ,其作用就是列出程式的源**,預設每次顯示10行。

list 行號:將顯示當前檔案以「行號」為中心的前後10行**,如:list 12

list 函式名:將顯示「函式名」所在函式的源**,如:list main

list :不帶引數,將接著上一次 list 命令的,輸出下邊的內容。

注意 :如果執行list 命令得到類似如下的列印,那是因為在編譯程式時沒有加入 -g 選項:

(gdb) list

1       ../sysdeps/i386/elf/start.s: no such file or directory.

in ../sysdeps/i386/elf/start.s

run:簡記為 r ,其作用是執行程式,當遇到斷點後,程式會在斷點處停止執行,等待使用者輸入下一步的命令。

回車:重複上一條命令。

set args:設定執行程式時的命令列引數,如:set args 33 55

show args:顯示命令列引數

continue:簡訊為 c ,其作用是繼續執行被斷點中斷的程式。

break:為程式設定斷點。

break 行號:在當前檔案的「行號」處設定斷點,如:break  33

break 函式名:在使用者定義的函式「函式名」處設定斷點,如:break cb_button

info breakpoints:顯示當前程式的斷點設定情況

disable breakpoints num:關閉斷點「num」,使其無效,其中「num」為 info breakpoints 中顯示的對應值

enable breakpoints num:開啟斷點「num」,使其重新生效

step:簡記為 s ,單步跟蹤程式,當遇到函式呼叫時,則進入此函式體(一般只進入使用者自定義函式)。

next:簡記為 n,單步跟蹤程式,當遇到函式呼叫時,也不進入此函式體;此命令同 step 的主要區別是,step 遇到使用者自定義的函式,將步進到函式中去執行,而 next 則直接呼叫函式,不會進入到函式體內。

until:當你厭倦了在乙個迴圈體內單步跟蹤時,這個命令可以執行程式直到退出迴圈體。

finish: 執行程式,直到當前函式完成返回,並列印函式返回時的堆疊位址和返回值及引數值等資訊。

stepi或nexti:單步跟蹤一些機器指令。

print 表示式:簡記為 p ,其中「表示式」可以是任何當前正在被測試程式的有效表示式,比如當前正在除錯c語言的程式,那麼「表示式」可以是任何c語言的有效表示式,包括數字,變數甚至是函式呼叫。

print a:將顯示整數 a 的值

print ++a:將把 a 中的值加1,並顯示出來

print name:將顯示字串 name 的值

print gdb_test(22):將以整數22作為引數呼叫 gdb_test() 函式

print gdb_test(a):將以變數 a 作為引數呼叫 gdb_test() 函式

bt:顯示當前程式的函式呼叫堆疊。

display 表示式:在單步執行時將非常有用,使用display命令設定乙個表示式後,它將在每次單步進行指令後,緊接著輸出被設定的表示式及值。如: display a

watch 表示式:設定乙個監視點,一旦被監視的「表示式」的值改變,gdb將強行終止正在被除錯的程式。如: watch a

kill:將強行終止當前正在除錯的程式

help 命令:help 命令將顯示「命令」的常用幫助資訊

call 函式(引數):呼叫「函式」,並傳遞「引數」,如:call  gdb_test(55)

layout:用於分割視窗,可以一邊檢視**,一邊測試:

layout src:顯示源**視窗

layout asm:顯示反彙編視窗

layout regs:顯示源**/反彙編和cpu暫存器視窗

layout split:顯示源**和反彙編視窗

ctrl + l:重新整理視窗

quit:簡記為 q ,退出gdb

當然,gdb的功能遠不止這些,包括多程序/多執行緒/訊號/遠端除錯等功能在這裡均沒有提及,有需要的讀者可以參考其它資訊。

gdb除錯及gdbserver遠端除錯

gdb偵錯程式是一款gnu開發組織並發布的unix linux下的程式除錯工具,具有強大的功能,足有與visual stido媲美,當然友好的介面是沒法相比的,呵呵。開始編譯程式將除錯資訊包含進去,gdb偵錯程式執行在shell中輸入gdb就好,也可以輸入gdb filename,filename是...

GDB除錯多檔案程式

以前用gdb除錯都只是除錯單個的檔案,在做dhcp二級relay的時候需要對整個工程進行gdb除錯,發現自己竟然不會!現在終於惡補上了,發到部落格上與大家分享。下面就以我除錯isc dhcp 為例來說一下除錯的過程 首先啟動dhcrelay sudo gdb dhcrelay 由於dhcrelay的...

gdb除錯多流程程式

預設設定下,在除錯多程序程式時gdb只會除錯主程序。但是gdb v7.0 支援多程序的分別以及同時除錯,換句話說,gdb可以同時除錯多個程式。只需要設定follow fork mode 預設值 parent 和detach on fork 預設值 on 即可。設定方法 set follow fork...