GDB調試

18. 重定向輸出shell

問題:若GDB與進程所屬終端不一樣,則進程的輸出不會出現GDB中vim

解決辦法:重定向被調試進程的標準輸出和標準錯誤函數


18.1 重定向spa

① 查看GDB所屬終端的設備文件線程


② 關閉進程的STDOUT_FILENO STDERR_FILENO指針


③ 在進程中以只寫方式打開GDB的終端設備文件/dev/pts/1」,達到從新生成STDOUT_FILENO STDERR_FILENO」目的調試



18.2 恢復進程

調試結束後,恢復過程步驟以下:作用域

 關閉進程的STDOUT_FILENO STDERR_FILENO
cmd


② 查看進程所屬終端


③ 在進程中以只寫方式打開進程的終端設備文件/dev/pts/4」,達到從新生成「STDOUT_FILENO STDERR_FILENO」目的



18.3 標準

標準做法爲,在文件「~/.gdbinit」中定義重定向函數,在GDB中直接調用

① vim ~/.gdbinit


② 重定向


③ 恢復




17. .gdbinit文件

文件「.gdbinit本質上是一個腳本,GDB 在啓動的時候會按必定的路徑順序尋找該文件(一般先當前目錄,而後用戶HOME目錄),一旦找到,就會自動執行裏面的命令


用途:

能夠把一些經常使用命令放在這個文件裏,這樣就不用每次進入 gdb 後再去手動輸入這些命令;

能夠把命令序列定義成一個新命令,這樣只要在 gdb 裏面輸入這個新命令就能夠自動執行命令序列


格式:

define 「CmdName

「Cmd Sequence

end


示例:



另外,若是用戶已經在 gdb 裏後,再去修改 .gdbinit ,只要經過:

(gdb) source  ~/.gdbinit

即可以讓那些新增長的改動生效



16. 執行shell命令

命令:shell 「Cmd

做用:在GDB中執行shell命令

示例:






15. 調用函數

命令:call 「FunctionName

做用:在程序的當前上下文環境中調用函數「FunctionName

示例:








14. 信號處理

查看

命令:handle 「SigName

做用:查看信號處理動做

示例:



設置

命令:handle 「SigName」 「Action

做用:設置信號處理動做

動做:

◇「stop「nostop:當GDB收到待發往被調試進程的信號時,是否中止程序的執行。只要「Stop」爲「Yes」,則「Print」爲「Yes」,即只要中止,就打印輸出

◇「print「noprint當GDB收到待發往被調試進程的信號時,是否打印提示消息。只要「Print」爲「No」,則「Stop」爲「No」,即只要不打印輸出,就不中止

◇「pass「nopass:程序繼續運行後,是否將該信號,傳遞給被調試進程

說明:GDB調試過程當中,全部發往被調試進程的信號,會先被GDB攔截,GDB視「Stop」決定是否中止程序的執行,視「Print」決定是否打印輸出。待程序繼續執行後(「c),根據「Pass to program」決定是否將該信號發往被調試進程



13. until

◇ until

執行程序,直到到達當前循環體外的下一行源代碼


◇ until 「FileName」:「n」

一直執行到文件「FileName」的第「n」行。注意,此時「n」行代碼並未執行,而處於等待執行狀態


◇ until 「Namespace」::「ClassName」::「FuncName」

一直執行到「FuncName」函數



12. 中斷點

中斷點包括斷點、臨時斷點以及觀察點

△ 查看全部中斷點

info b



△ 禁用中斷點

disable 「BreakNo1」 「BreakNo2」...

命令簡寫:dis



△ 開啓中斷點

enable 「BreakNo1」 「BreakNo2」...

命令簡寫:en



△ 刪除中斷點

delete 「BreakNo1」 「BreakNo2」...

命令簡寫:d



△ 刪除全部中斷點

delete

命令簡寫:d



△ 設置觸發條件

「cmd」「args」if 「condition」

參數:「cmd」可爲「break」,「watch」,「rwatch」

示例:

b main.cpp:11 if m > 13                          b main.cpp:11 if msg.length()==14                             b main.cpp:11 if strlen(data)==14

wa m if m > 37                                         rw val if n == -20


△ 修改觸發條件

condition 「BreakNo」 「Condition」

命令簡寫:cond

 

若中斷點無觸發條件,則進行添加;若中斷點原有觸發條件,則進行替換


△ 刪除觸發條件

condition 「BreakNo」

命令簡寫:cond



△ 忽略中斷若干次

ignore 「BreakNo」 「Count」


設置中斷點「BreakNo」忽略接下來的「Count」次命中

若是中斷點既設置了中斷條件,又設置了忽略次數,則先計算中斷條件後遞減忽略次數



11. 命令列表

命令:commands 「BreakNo」

功能:一旦命中「BreakNo」對應的斷點或者觀察點,自動執行編輯的命令

參數: 「BreakNo」爲斷點或者觀察點的編號

簡寫:comm

示例:

查看全部中斷點


「24」號斷點編輯命令列表


命令列表以「end」結束,上述命令列表的做用是,每當斷點「24」命中,即打印變量「m」和「n」的值,而後「continue」繼續執行,效果以下




10. 觀察點

觀察點用於監視表達式。注意,變量也爲表達式

觀察點不依賴於設定的位置,可是與表達式的做用域有關。也就是說,觀察點必須在程序運行時纔可設置,且用到的符號必須在當前上下文中可見

超出做用域,好比子函數執行結束,則在局部變量上設置的觀察點,將自動刪除:


10.1 watch

命令:watch 「Expression」

功能:每當表達式「Expression」的值發生改變以後,自動中斷程序,並打印變化前和變化後的值

簡寫:wa或wat

說明:

① 中斷髮生的時機,是在表達式的值發生改變以後,即

wa 「m」

程序代碼爲

9        ++m;

10      --n;

則中斷位於第「10」行,此時,變量「m」的值已經改變,GDB會自動顯示「m」變化前和變化後的值

② 若賦值操做沒有改變表達式的當前值,則中斷不會觸發,即

wa 「m」

程序代碼爲

11       int tmp = m;

12       m = tmp;

「12」行的賦值不會引起中斷


10.2 rwatch

命令:rwatch 「Expression」

功能:每當須要引用表達式「Expression」的值以前,自動中斷程序,並打印表達式的當前值

簡寫:rw

說明:中斷髮生的時機,是在引用表達式的值以前,即

rw 「m」

程序代碼爲

11       int tmp = m;

則中斷打到第「11」行,此時「11」行代碼並未執行,而「10」行代碼剛剛執行結束


10.3 使用

△ watch 「Condition」


 watch 「Expression」


 rwatch 「Expression」


 查看全部觀察點




9. 命令簡寫

GDB並未定義特定命令的簡寫,現有簡寫取自命令的字符前綴

只要能經過前綴惟一識別命令,即爲該命令的簡寫








8. 斷點

8.1 普通斷點

命令:break,簡寫:b


△ 設置斷點

「FileName」:「n

在文件 「file」的第「n」行設置一個斷點

須要注意的是,當斷點打到「n」行時,第「n」行的代碼並未執行,此時第「n-1」行代碼剛剛執行完,「n」行的代碼處於待執行狀態

「Namespace」::「ClassName」::「FuncName」

在函數「FuncName」設置一個斷點


△ 查看全部斷點

info b


8.2 臨時斷點

與普通斷點相似,但命中後會自動刪除

命令:tbreak,簡寫:tb


8.3 添加觸發條件

命令:condition 「BreakNo」「Condition」

做用:爲斷點「BreakNo」



7. list

功能:顯示源程序代碼

命令簡寫:l


◇ 顯示以文件「FileName「n行爲中心的上下五行代碼

list 「FileName」:「n

示例:



◇ 顯示以函數「FuncName」爲中心的上下五行代碼

list「FuncName

示例:


「GdbFunc」函數位於另外一個文件「include.h」


◇ 顯示文件「FileName第「m行到第「n行的代碼

list 「FileName」:m,「n

示例:


斷點命中源文件「main.cpp」第「12」行


list命令顯示「main.cpp」第「12」行到第「17」行的代碼


◇ 繼續顯示接下來的代碼

list

不帶參數,將接着上一次 list 命令的,輸出下邊的內容



6.調試運行中的進程

gdb /path/exe pid

進程運行異常時,好比死循環或者死鎖時,能夠經過該方法,查看進程當前的狀態

進入gdb後,能夠經過:

① bt

查看當前進程狀態

② info thread

查看全部線程

③ thread

查看當前線程

④ thread no

切換線程,no爲目標線程號



5. 打印變量

設置結構體顯示格式:set print pretty on

打印指針地址:p ptr

打印指針變量:p *ptr




4. 進入特定棧

f 棧號


輸入f 5,便可進入崩潰鏈中的指定環節,即cloudsee_transport.cc:116行,函數CCloudSeeTransport::SetupThread()裏的崩潰點。



3. 查看堆棧

bt




2. 查看崩潰信息

where




1. 查看core文件

gdb exefile core

相關文章
相關標籤/搜索