基本i threads 等操做略過,只談線程同步、異步控制:shell
先點到,gdb attach到主線程t1 時,全部線程都會中止,所謂同步異步效果,是指在apply continue到全部線程以後,app
再切換到t2,發現t3還在運行(若是t3卡在了斷點上,也算運行,只不過運行後中止了)。異步
再點到,gdb 直接attach 到非主線程時,是不影響,其餘線程的啓停的。不管如何設置non-stop或者schedule選項。async
如下,重點說下non-stop和schedule選項:函數
1 non-stop測試
只能在~/.gdbinit裏設置,不能在gdb運行時設置,設置內容爲:線程
set target-async 1
set pagination off
set non-stop on調試
attach到主線程t1後,切換t3,ip
設置t3和t2內部的斷點,執行c,t3運行後卡在斷點,可是t2是不運行的,此時應t apply t2 t3(爲了回到中斷,只寫t2會沒法輸入gdb操做) c,才能通知t2運行。get
若是t2無斷點,那麼一次t apply t2 t3後,他就是一直執行的了!
2 scheduler-locking選項
能夠在主線程或者子線程設置都可。
在使用step或者continue命令調試當前被調試線程的時候,
off 不鎖定任何線程,也就是全部線程都執行;若是
on 只有當前被調試程序會執行;
step 在單步的時候,除了next過一個函數的狀況(熟悉狀況的人可能知道,這實際上是一個設置斷點而後continue的行爲)之外,只有當前線程會執行。
能夠理解爲step鎖,非step不鎖。
t2和t3設置斷點後,設置sche爲off(倆t都執行)或者on(只看到一個thr執行),直接c,就能看到t2和t3的同步或異步效果;
這時,若是t app 2 3 c,執行,效果和c同樣,即便t二、t3只有一個斷點,也會同時停下來的(non-stop在非斷點的t不會停,除非新設b斷干預之)。
注意:set non-stop on和scheduler-locking同時設置效果未定義,測試,設置non-stop後再設置sche=on貌似無效!
參考:
coolshell的 gdb系列
gdb技巧集 http://www.kancloud.cn/wizardforcel/gdb-tips-100/146771