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