/******************************************************************多線程
* 本文爲博主學習《Debugging with GDB》的讀書筆記,版權全部,轉載請註明出處。函數
*學習
******************************************************************/spa
在GDB中運行程序線程
1、啓動程序調試
若是在啓動gdb時沒有指明程序,可使用命令file或exec-file加載程序;rest
run(r):進程
run(r)命令使程序啓動,能夠在run命令中指明程序參數;值得注意的是,首次運行run後,若是再次執行run而且不帶參數,會以以前的參數運行程序。rem
set args:it
指定程序的參數。set args後,run能夠不帶參數而以指定的參數運行程序。若是set args不太參數,清楚程序參數,執行run後程序不太參數運行。
在加載程序後,若是程序從新編譯,gdb會根據符號文件的更改時間自動重載加載符號文件,因此,不須要從新加載文件。
start:
使用start命令使程序停在main函數的第一條語句。
2、調試已經在運行的程序
attach pid:
從ps得到進程號,經過attach命令鏈接到該進程。attach一個進程後,gdb首先stop該進程,這樣就能夠設置斷點,執行step、continue等命令;若是執行r命令,會殺掉原來的進程。
detach:
釋放該進程,原進程會繼續執行。
3、調試多個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
4、調試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,參見第三部分。
5、多線程調試
info threads:
顯示線程信息。
thread thread-id:
切換到對應線程。
thread name [name]:
修改當前thread的名稱。默認爲程序名稱。
6、Checkpoint
在Linux,gdb支持保留程序在某個時候的快照,除了進程號和已經輸出的內容,全部狀態恢復到快照狀態。
經過如下命令實現快照。
checkpoing: 生成當前狀態的快照
info checkpoint:顯示快照信息
restart checkpoint-id:恢復到某個checkpoint
delete checkpoint checkpoint-id:刪除某個checkpoint
/******************************************************************
* 本文爲博主學習Debugging with GDB的讀書筆記,版權全部,轉載請註明出處。
*
******************************************************************/