GDB除錯方法 學習記錄

2021-09-27 00:24:33 字數 3903 閱讀 9168

主要是學習記錄,可能存在大段複製文字。侵刪。

gdb除錯命令詳解

【面試】gdb除錯

gdb: the gnu project debugger

gdb 除錯利器

使用 gdb 除錯 linux 軟體

5. cgdb 功能鍵

1.啟動你的程式,可以按照你的自定義的要求隨心所欲的執行程式。

2.可讓被除錯的程式在你所指定的調置的斷點處停住。(斷點可以是條件表示式)

3.當程式被停住時,可以檢查此時你的程式中所發生的事。

4.動態的改變你程式的執行環境。

```

gcc -g test.cpp -o out

```

在cmakelists.txt 檔案裡新增如下字段

set(cmake_build_type "debug")  

set(cmake_cxx_flags_debug "$env -o0 -wall -g2 -ggdb")

set(cmake_cxx_flags_release "$env -o3 -wall")

在node啟動部分新增 launch-prefix

launch-prefix=

"xterm -e gdb -ex run --args"

"grid_path_searcher" type=

"demo_node" name=

"demo_node" output=

"screen" required =

"true" launch-prefix=

"xterm -e gdb -ex run --args"

>

$gdb programmer     # 啟動gdb

>break main # 設定斷點

>run # 執行除錯程式

>next # 單步除錯

>print var1 # 在除錯過程中,我們需要檢視當前某個變數值的時候,使用print 命令列印該值

>list # 顯示當前除錯處的源**

>info b # 顯示當前斷點設定情況

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

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

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

until+行號: 執行至某行,不僅僅用來跳出迴圈

call 函式(引數):呼叫程式中可見的函式,並傳遞「引數」,如:call gdb_test(55)

quit:簡記為 q ,退出gdb

set args //可指定執行時引數。(如:set args 10 20 30 40 50 )

show args //命令可以檢視設定好的執行引數。

run (r) //不指定執行引數

r 10 20 30 40 50 //指定執行引數

break n (簡寫b n):在第n行處設定斷點

(可以帶上**路徑和**名稱: b oagupdate.cpp:578)

b fn1 if a>b:條件斷點設定

break func(break縮寫為b):在函式func()的入口處設定斷點,如:break cb_button

delete 斷點號n:刪除第n個斷點

disable 斷點號n:暫停第n個斷點

enable 斷點號n:開啟第n個斷點

clear 行號n:清除第n行的斷點

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

delete breakpoints:清除所有斷點:

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

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

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

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() 函式

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

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

whatis :查詢變數或函式

info function: 查詢函式

擴充套件info locals: 顯示當前堆疊頁的所有變數

where/bt :當前執行的堆疊列表;

bt backtrace 顯示當前呼叫堆疊

up/down 改變堆疊顯示的深度

set args 引數:指定執行時的引數

show args:檢視設定好的引數

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

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

layout src:顯示源**視窗

layout asm:顯示反彙編視窗

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

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

ctrl + l:重新整理視窗

$ info threads //檢視現在執行的執行緒的id號

(gdb) info threads

id target id frame

*1 process 16066

"fac" main (

) at .

./factoral.cpp:

9$ps -ef | grep 程序名 //通過上述命令的到待除錯程序的pid

$gdb

(gdb) attach "pid"

//上面的「pid」即待除錯程序的pid

1:cgdb分為上下兩欄,上面類似於vi視窗(就稱之為vi視窗吧)顯示對應的**,下面gdb視窗進行除錯操作,上下視窗連動,也就是說vi視窗裡顯示的**會跟隨gdb視窗裡除錯的位置同步進退。

2:按esc鍵可讓輸入焦點進入到vi視窗,再按i鍵回到gdb視窗。按其它鍵也可以進入到vi視窗,比如小鍵盤上的按鍵(如果此時num lock處於開啟狀態)。

3:vi視窗可進行的操作包括,上下左右翻動,按冒號(:)開始進行設定(具體設定命令可以參考這裡),比如設定上面視窗全屏顯示(即下面的gdb視窗被隱藏),按斜幹(/)為在當前檔案內搜尋,按o鍵可以顯示當前程式關聯的檔案列表,按空格則在當前位置設定/取消斷點。

GDB除錯方法

一 多執行緒除錯 多執行緒除錯可能是問得最多的。其實,重要就是下面幾個命令 二 除錯巨集 這個問題超多。在gdb下,我們無法print巨集定義,因為巨集是預編譯的。但是我們還是有辦法來除錯巨集,這個需要gcc的配合。在gcc編譯程式的時候,加上 ggdb3引數,這樣,你就可以除錯巨集了。另外,你可以...

gdb除錯學習

一般來說,gdb主要幫忙你完成下面四個方面的功能 1 啟動你的程式,可以按照你的自定義的要求隨心所欲的執行程式。2 可讓被除錯的程式在你所指定的調置的斷點處停住。斷點可以是條件表示式 3 當程式被停住時,可以檢查此時你的程式中所發生的事。4 動態的改變你程式的執行環境。除錯的程式如下 root lo...

gdb除錯學習

gdb是乙個由gnu開源組織發布的,unix linux作業系統下的,基於命令列,功能強大的程式除錯工具。可以用來除錯c,c 程式。在今天驗收實驗時發生特別尷尬的事情,由於在編譯.c檔案的時候沒有加 g選項,所以一直無法用gdb除錯程式,所以在總結gdb之前先來看看gcc在編譯時的引數。a.常規選項...