主要是學習記錄,可能存在大段複製文字。侵刪。
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.常規選項...