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
△ 設置斷點
b 「FileName」:「n」
在文件 「file」的第「n」行設置一個斷點
須要注意的是,當斷點打到第「n」行時,第「n」行的代碼並未執行,此時第「n-1」行代碼剛剛執行完,第「n」行的代碼處於待執行狀態
b 「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