多線程調(diào)試方法_第1頁(yè)
多線程調(diào)試方法_第2頁(yè)
多線程調(diào)試方法_第3頁(yè)
多線程調(diào)試方法_第4頁(yè)
多線程調(diào)試方法_第5頁(yè)
已閱讀5頁(yè),還剩1頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、set target-async 1set pagination offset non-stop oninfo threads 顯示當(dāng)前可調(diào)試的所有線程,每個(gè)線程會(huì)有一個(gè)GDB為其分配的ID,后面操作線程的時(shí)候會(huì)用到這個(gè)ID。 前面有*的是當(dāng)前調(diào)試的線程。 thread ID 切換當(dāng)前調(diào)試的線程為指定ID的線程。 break thread_test.c:123 thread all在所有線程中相應(yīng)的行上設(shè)置斷點(diǎn)thread apply ID1 ID2 command 讓一個(gè)或者多個(gè)線程執(zhí)行GDB命令command。 thre

2、ad apply all command 讓所有被調(diào)試線程執(zhí)行GDB命令command。 set scheduler-locking off|on|step 估計(jì)是實(shí)際使用過(guò)多線程調(diào)試的人都可以發(fā)現(xiàn),在使用step或者continue命令調(diào)試當(dāng)前被調(diào)試線程的時(shí)候,其他線程也是同時(shí)執(zhí)行的,怎么只讓被調(diào)試程序執(zhí)行呢?通過(guò)這個(gè)命令就可以實(shí)現(xiàn)這個(gè)需求。off 不鎖定任何線程,也就是所有線程都執(zhí)行,這是默認(rèn)值。 on 只有當(dāng)前被調(diào)試程序會(huì)執(zhí)行。 step 在單步的時(shí)候,除了next過(guò)一個(gè)函數(shù)的情況(熟悉情況的人可能知道,這其實(shí)是一個(gè)設(shè)置斷點(diǎn)然后conti

3、nue的行為)以外,只有當(dāng)前線程會(huì)執(zhí)行。 作者:破砂鍋 開源的GDB被廣泛使用在Linux、OSX、Unix和各種嵌入式系統(tǒng)(例如手機(jī)),這次它又帶給我們一個(gè)驚喜。 多線程調(diào)試之痛 調(diào)試器(如VS2008和老版GDB)往往只支持all-stop模式,調(diào)試多線程程序時(shí),如果某個(gè)線程斷在一個(gè)斷點(diǎn)上,你的調(diào)試器會(huì)讓整個(gè)程序freeze,直到你continue這個(gè)線程,程序中的其他線程才會(huì)繼續(xù)運(yùn)行。這個(gè)限制使得被調(diào)試的程序不能夠像真實(shí)環(huán)境中那樣運(yùn)行-當(dāng)某個(gè)線程斷在一個(gè)斷點(diǎn)上,讓其他線程并行運(yùn)行。GDBv7.0引入的non-stop模式使得這個(gè)問(wèn)題迎刃而解。在這個(gè)模式下,· 當(dāng)某個(gè)或

4、多個(gè)線程斷在一個(gè)斷點(diǎn)上,其他線程仍會(huì)并行運(yùn)行 · 你可以選擇某個(gè)被斷的線程,并讓它繼續(xù)運(yùn)行 讓我們想象一下,有了這個(gè)功能后· 當(dāng)其他線程斷在斷點(diǎn)上時(shí),程序里的定時(shí)器線程可以正常的運(yùn)行了,從而避免不必要得超時(shí)  · 當(dāng)其他線程斷在斷點(diǎn)上時(shí),程序里的watchdog線程可以正常的運(yùn)行了,從而避免嵌入式硬件以為系統(tǒng)崩潰而重啟 · 可以控制多個(gè)線程運(yùn)行的順序,從而重現(xiàn)deadlock場(chǎng)景了。由于GDB可以用python腳本驅(qū)動(dòng)調(diào)試,理論上可以對(duì)程序在不同的線程運(yùn)行順序下進(jìn)行自動(dòng)化測(cè)試。因此,non-stop模式理所當(dāng)然成為多線程調(diào)試“必殺技”。這200

5、9年下半年之后發(fā)布的Linux版本里都帶有GDBv7.0之后的版本。很好奇,不知道VS2010里是不是也支持類似的調(diào)試模式了。演示GDB的non-stop模式  讓破砂鍋用一個(gè)C+小程序在Ubuntu Linux 09.10下demo這個(gè)必殺技。雖然我的demo使用命令行版gdb,如果你喜歡圖形化的調(diào)試器,Eclipse2009年5月之后的版本可以輕松的調(diào) 用這個(gè)功能,詳情參見Eclipse參見/node/723   1. 編譯以下程序nonstop  1 / gdb non-st

6、op mode demo 2 / build instruction: g+ -g -o nonstop nonstop.cpp -lboost_thread 3  4 #include <iostream> 5 #include <boost/thread/thread.hpp> 6  7 struct op 8

7、  9         op(int id): m_id(id) 10 11         void operator()()12         13         

8、;        std:cout << m_id << " begin" << std:endl;14                 std:cout << m_id <&

9、lt; " end" << std:endl;15         16 17         int m_id;18 19 20 int main(int argc, char * argv)21 22   

10、;      boost:thread t1(op(1), t2(op(2), t3(op(3);23         t1.join(); t2.join(); t3.join();24         return 0;25 26  2. 把一下3行添加到/.gdb

11、init來(lái)打開non-stop模式 set target-async 1set pagination offset non-stop on 3. 啟動(dòng)gdb,設(shè)斷點(diǎn),運(yùn)行.可以看到主線程1是running,3個(gè)子線程都斷在斷點(diǎn)上,而不是只有一個(gè)子線程斷在斷點(diǎn)上./devroot/nonstop$ gdb ./nonstopGNU gdb (GDB) 7.0-ubuntuReading symbols from /home/frankwu/devr

12、oot/nonstop/nonstop.done.(gdb) break 14Breakpoint 1 at 0x402058: file nonstop.cpp, line 14.(gdb) break 24Breakpoint 3 at 0x401805: file nonstop.cpp, line 24.(gdb) runStarting program: /home/frank

13、wu/devroot/nonstop/nonstopThread debugging using libthread_db enabledNew Thread 0x7ffff6c89910 (LWP 2762)New Thread 0x7ffff6488910 (LWP 2763)1 beginBreakpoint 1, op:operator() (this=0x605118) at nonstop.cpp:141

14、4                  std:cout << m_id << " end" << std:endl;2 beginBreakpoint 1, op:operator() (this=0x605388) at nonst

15、op.cpp:1414                  std:cout << m_id << " end" << std:endl;New Thread 0x7ffff5c87910 (LWP 2764)3 beginBreakpoint&

16、#160;1, op:operator() (this=0x605618) at nonstop.cpp:1414                  std:cout << m_id << " end" << std:endl;(gdb) in

17、fo threads  4 Thread 0x7ffff5c87910 (LWP 2764)  op:operator() (this=0x605618) at nonstop.cpp:14  3 Thread 0x7ffff6488910 (LWP 2763)  op:operator() (this=0x605388) at nonstop.cpp:14 

18、; 2 Thread 0x7ffff6c89910 (LWP 2762)  op:operator() (this=0x605118) at nonstop.cpp:14* 1 Thread 0x7ffff7fe3710 (LWP 2759)  (running)4. 讓線程3繼續(xù)運(yùn)行,注意我顧意把主線程1也continue,這是我發(fā)現(xiàn)的workaround,否則gdb不能切回thread 1.(gdb) threa

19、d apply 3 1 continueThread 3 (Thread 0x7ffff6488910 (LWP 2763):Continuing.Thread 1 (Thread 0x7ffff7fe3710 (LWP 2759):Continuing.Cannot execute this command while the selected thread is 

20、running.2 endThread 0x7ffff6488910 (LWP 2763) exitedwarning: Unknown thread 3.Thread 1 (Thread 0x7ffff7fe3710 (LWP 2759):Continuing.Cannot execute this command while the selected thread is r

21、unning.(gdb) info threads  4 Thread 0x7ffff5c87910 (LWP 2764)  op:operator() (this=0x605618) at nonstop.cpp:14  2 Thread 0x7ffff6c89910 (LWP 2762)  op:operator() (this=0x605118) at 

22、;nonstop.cpp:14* 1 Thread 0x7ffff7fe3710 (LWP 2759)  (running)5. 讓另外兩個(gè)線程繼續(xù)運(yùn)行而結(jié)束,主線程斷在第24行,最后結(jié)束.(gdb) thread apply 4 2 1 continueThread 4 (Thread 0x7ffff5c87910 (LWP 2764):Continuing.Thread 2 (Thread 0x7ffff6c89910 (LWP 2762):Continuin

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論