/******************************************************************
* 本文為博主學習《Debugging with GDB》的讀書筆記,版權所有,轉載請注明出處。
*
******************************************************************/
在GDB中運行程序
一、啟動程序
如果在啟動gdb時沒有指明程序,可以使用命令file或exec-file加載程序;
run(r):
run(r)命令使程序啟動,可以在run命令中指明程序參數;值得注意的是,首次運行run后,如果再次執行run並且不帶參數,會以之前的參數運行程序。
set args:
指定程序的參數。set args后,run可以不帶參數而以指定的參數運行程序。如果set args不太參數,清楚程序參數,執行run后程序不太參數運行。
在加載程序后,如果程序重新編譯,gdb會根據符號文件的更改時間自動重載加載符號文件,所以,不需要重新加載文件。
start:
使用start命令使程序停在main函數的第一條語句。
二、調試已經在運行的程序
attach pid:
從ps獲得進程號,通過attach命令連接到該進程。attach一個進程后,gdb首先stop該進程,這樣就可以設置斷點,執行step、continue等命令;如果執行r命令,會殺掉原來的進程。
detach:
釋放該進程,原進程會繼續執行。
三、調試多個inferiors和程序
gdb允許在一個會話下調試多個程序,比如一個進程fork出兩個或者多個進程,或者把當前程序復制出一個副本,這些都是通過inferior實現控制。
info inferiors:
顯示當前管理的inferiors。
inferior infono:
切換到對應的inferior。
add-inferior [-copies n] [-exec executable]:
添加n(默認為1)個inferior,如果指明executable文件,可以以后通過file加載符號文件。
clone-inferiror [-copies n] [infno]:
復制編號為infno(默認為當前)的inferior。
其它相關命令:
remove-inferiors infno
detach inferior infno
kill inferiors infno
maint info program-spaces
四、調試fork
默認情況下,當一個程序fork,gdb會跟蹤父進程而子進程暢通無止的執行。如果在child中設置了一個斷點,執行到斷點處,child會收到一個SIGTRAP信號,默認為終止程序。
最開始調試child進程的方法是在child中設置一個sleep,然后通過attach連到child。
set follow-fork-mode mode
show follow-fork-mode:
在Linux2.5.46以后,gdb支持fork函數的調試;通過set-follow-mode命令,設置跟隨parent還是child,如果不設置默認為跟隨parent。
set detach-on-fork mode
show detach-on-fork:
在Linux,可以通過set detach-on fork off命令,在fork后,對parent和child都進行調試。父、子進程為多個inferiors,參見第三部分。
五、多線程調試
info threads:
顯示線程信息。
thread thread-id:
切換到對應線程。
thread name [name]:
修改當前thread的名稱。默認為程序名稱。
六、Checkpoint
在Linux,gdb支持保留程序在某個時候的快照,除了進程號和已經輸出的內容,所有狀態恢復到快照狀態。
通過以下命令實現快照。
checkpoing: 生成當前狀態的快照
info checkpoint:顯示快照信息
restart checkpoint-id:恢復到某個checkpoint
delete checkpoint checkpoint-id:刪除某個checkpoint
/******************************************************************
* 本文為博主學習Debugging with GDB的讀書筆記,版權所有,轉載請注明出處。
*
******************************************************************/