gdb 調試多線程

基本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

相關文章
相關標籤/搜索