# GDB調試 ## 啟動gdb調試的方法 一般有三種方式: 1. gdb filename 2. gdb attach pid 3. gdb filename corename ### 方法一 直接調試目標程式 gdb filename filename就是需要啟動調試的程式文件名,直接gdb啟動 ...
GDB調試
啟動gdb調試的方法
一般有三種方式:
- gdb filename
- gdb attach pid
- gdb filename corename
方法一 直接調試目標程式
gdb filename
filename就是需要啟動調試的程式文件名,直接gdb啟動一個程式進行調試,也就是說這個程式還沒有啟動。
方法二 附加進程
gdb attach pid
一個程式啟動了,我們想要調試這個程式。
pid就是這個進程的ID
當gdb attac上目標進程之後,調試器會暫停下來,可以用continue繼續運行。調試完成之後可以使用detach讓程式與gdb分離,這樣程式就可以正常運行了。然後就可以quit了
方法三 進程crash之後定位問題--調試core文件
gdb filename corename
corename就是產生的core文件
永久配置生成core文件
- 在 /etc/security/limits.conf中添加一行
#<domain> <type> <item> <value>
* soft core unlimited
- 把 ulimit -c unlimited 添加在 /etc/profile文件最後一行中去,source /etc/profile。 root用戶,其他用戶添加到bashrc這種就行
gdb 常用命令詳解
1、運行命令
run:簡記為 r ,其作用是運行程式,當遇到斷點後,程式會在斷點處停止運行,等待用戶輸入下一步的命令。
continue (簡寫c ):繼續執行,到下一個斷點處(或運行結束)
next:(簡寫 n),單步跟蹤程式,當遇到函數調用時,也不進入此函數體;此命令同 step 的主要區別是,step 遇到用戶自定義的函數,將步進到函數中去運行,而 next 則直接調用函數,不會進入到函數體內。
step (簡寫s):單步調試如果有函數調用,則進入函數;與命令n不同,n是不進入調用的函數的
until:當你厭倦了在一個迴圈體內單步跟蹤時,這個命令可以運行程式直到退出迴圈體。
until+行號: 運行至某行,不僅僅用來跳出迴圈
finish: 運行程式,直到當前函數完成返回,並列印函數返回時的堆棧地址和返回值及參數值等信息。
call 函數(參數):調用程式中可見的函數,並傳遞“參數”,如:call gdb_test(55)
quit:簡記為 q ,退出gdb
2、斷點
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:清除所有斷點:
3、查看源碼
list :簡記為 l ,其作用就是列出程式的源代碼,預設每次顯示10行。
list 行號:將顯示當前文件以“行號”為中心的前後10行代碼,如:list 12
list 函數名:將顯示“函數名”所在函數的源代碼,如:list main
list :不帶參數,將接著上一次 list 命令的,輸出下邊的內容。
4、列印表達式
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: 顯示當前堆棧頁的所有變數
5、查看運行信息
where/bt :當前運行的堆棧列表;
bt backtrace 顯示當前調用堆棧
up/down 改變堆棧顯示的深度
set args 參數:指定運行時的參數
show args:查看設置好的參數
info program: 來查看程式的是否在運行,進程號,被暫停的原因。
6、分割視窗
layout:用於分割視窗,可以一邊查看代碼,一邊測試:
layout src:顯示源代碼視窗
layout asm:顯示反彙編視窗
layout regs:顯示源代碼/反彙編和CPU寄存器視窗
layout split:顯示源代碼和反彙編視窗
Ctrl + L:刷新視窗
gdb 調試多線程程式
set scheduler-locking on/step/off
- set scheduler-locking on:鎖定當前線程,只觀察這個線程的運行情況,其他線程處於暫停狀態
- set scheduler-locking step:鎖定當前線程,調用next、step其他線程會處於暫停狀態,調用until、finish、return其他線程有機會運行。
- set scheduler-locking off:關閉鎖定當前線程。