gdb高階功能與配置
原文地址:https://www.cnblogs.com/anhongyu/p/12709760.html
1. 檢視函式對應的彙編程式碼
gdb -batch -ex "disas /m <function-name>" "./<binary-name>"
作用:檢視<binary-name>程式裡<function-name>函式對應的彙編程式碼,"/m"修飾符同時顯示原始碼。
當然,你也可以選擇用objdump;相比之下,我更喜歡gdb,因為我通常只是對某一個函式的彙編程式碼感興趣。
2. 關閉new thread / thread exited訊息
除錯多執行緒程式時,經常會被new thread / thread exited的訊息刷屏,分散除錯者的注意力。
可以通過修改gdb配置檔案(一般是"~/.gdbinit"檔案),關閉此資訊。
set print thread-events off
3. 遮蔽gdb signal資訊
gdb除錯有時會遇到“Program received signal SIGSEGV, Segmentation fault.”的中斷,執行continue之後,很快又會斷住。
解決方法是忽略相應訊號,在gdb中輸入如下指令
# 檢視SIGSEGV訊號狀態
handle SIGSEGV
# 關閉print
handle SIGSEGV noprint
參考:https://blog.csdn.net/ma100/article/details/62424408
4. 斷點命令列表
當gdb遇到斷點時,幾乎總是要檢視某個變數。如果反覆遇到同一個斷點,將反覆檢視相同的變數。
如果能讓gdb在每次到達某個斷點時,自動執行一組命令,豈不完美。斷點命令列表就是用來做這件事的。
(gdb) break main.cc:13
# 此時,你會獲得一個斷點號<breakpoint-number>
(gdb) commands <breakpoint-number>
>silent
>print <var-name>
>continue
>end
(gdb)
需要額外解釋的一點,silent命令經常是命令列表的第一條命令,以使gdb更安靜地觸發斷點。
5. 排程器鎖
按說在gdb裡是可以通過 print 或 call 來達到呼叫函式的目的的,但在真實生產環境中(多執行緒程式的除錯),往往會遇到下面的錯誤:
"The program stopped in another thread while making a function call from GDB."
出現這個錯誤的原因是,你在斷點處呼叫函式的同時,其他執行緒也跟著執行起來了,並且有一個執行緒遇到了這個斷點。解決的方法很簡單,gdb裡有一個叫做scheduler-locking的東西,在 print 或 call 之前置為“on”,列印完之後再恢復即可。
我在.gdbinit裡增加了一個擴充套件的列印巨集,幫助我完成這個事情。
define pp
if $argc != 1
help pp
else
set scheduler-locking on
print $arg0
set scheduler-locking step
end
end
補充一點,gdb預設的scheduler-locking模式是step,所以要記得恢復預設值。
關於scheduler-locking,gdb官方文件是這麼介紹的
set scheduler-locking mode
Set the scheduler locking mode. It applies to normal execution, record mode,
and replay mode. If it is off, then there is no locking and any thread may
run at any time. If on, then only the current thread may run when the inferior
is resumed. The step mode optimizes for single-stepping; it prevents other
threads from preempting the current thread while you are stepping, so that the
focus of debugging does not change unexpectedly.show scheduler-locking
Display the current scheduler locking mode.
6. 我的簡易版gdb配置樣例
set print thread-events off
define pac
if $argc != 1
help pac
else
print $arg0
continue
end
end
document pac
Print And Continue
usage: pac <var>
end
define pp
if $argc != 1
help pp
else
set scheduler-locking on
print $arg0
set scheduler-locking step
end
end
document pp
Print in scheduler-locking mode
usage: pp <var>
end
7. 臨時向檔案輸出資訊
這種情況往往是因為輸出資訊較多,刷屏了,或者怎樣。
比如,要用到info functions輸出所有函式,結果往往一屏顯示不了,可以將其輸出到檔案。
(gdb) set logging file <file name>
(gdb) set logging on
(gdb) info functions
(gdb) set logging off
8. 設定動態連結庫搜尋路徑
(gdb) set solib-search-path <path>
(gdb) show solib-search-path