gdb 調試多線程


基本i threads 等操作略過,只談線程同步、異步控制:

先點到,gdb attach到主線程t1 時,所有線程都會停止,所謂同步異步效果,是指在apply continue到所有線程之后,

再切換到t2,發現t3還在運行(如果t3卡在了斷點上,也算運行,只不過運行后停止了)。

再點到,gdb 直接attach 到非主線程時,是不影響,其他線程的啟停的。無論如何設置non-stop或者schedule選項。

 

以下,重點說下non-stop和schedule選項:

1 non-stop

只能在~/.gdbinit里設置,不能在gdb運行時設置,設置內容為:

set target-async 1
set pagination off
set non-stop on

attach到主線程t1后,切換t3,

設置t3和t2內部的斷點,執行c,t3運行后卡在斷點,但是t2是不運行的,此時應t apply t2 t3(為了回到中斷,只寫t2會無法輸入gdb操作) c,才能通知t2運行。

如果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一樣,即使t2、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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM