多线程调试方法_第1页
多线程调试方法_第2页
多线程调试方法_第3页
多线程调试方法_第4页
多线程调试方法_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、set target-async 1set pagination offset non-stop oninfo threads显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID。前面有*的是当前调试的线程。thread ID切换当前调试的线程为指定ID的线程。break thread_test.c:123 thread all在所有线程中相应的行上设置断点thread apply ID1 ID2 command让一个或者多个线程执行GDB命令command。thread apply all command让所有被调试线程执行GDB命令command

2、。set scheduler-locking off|on|step估计是实际使用过多线程调试的人都可以发现,在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。off 不锁定任何线程,也就是所有线程都执行,这是默认值。on 只有当前被调试程序会执行。step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。作者:破砂锅 开源的GDB被广泛使用在Linux、OSX、Unix和各种嵌入式系统(例如手机),这次它又

3、带给我们一个惊喜。 多线程调试之痛 调试器(如VS2008和老版GDB)往往只支持all-stop模式,调试多线程程序时,如果某个线程断在一个断点上,你的调试器会让整个程序freeze,直到你continue这个线程,程序中的其他线程才会继续运行。这个限制使得被调试的程序不能够像真实环境中那样运行-当某个线程断在一个断点上,让其他线程并行运行。GDBv7.0引入的non-stop模式使得这个问题迎刃而解。在这个模式下, 当某个或多个线程断在一个断点上,其他线程仍会并行运行 你可以选择某个被断的线程,并让它继续运行 让我们想象一下,有了这个功能后 当其他线程断在断点上时,程序里的定时器线程可以正

4、常的运行了,从而避免不必要得超时 当其他线程断在断点上时,程序里的watchdog线程可以正常的运行了,从而避免嵌入式硬件以为系统崩溃而重启 可以控制多个线程运行的顺序,从而重现deadlock场景了。由于GDB可以用python脚本驱动调试,理论上可以对程序在不同的线程运行顺序下进行自动化测试。因此,non-stop模式理所当然成为多线程调试“必杀技”。这2009年下半年之后发布的Linux版本里都带有GDBv7.0之后的版本。很好奇,不知道VS2010里是不是也支持类似的调试模式了。演示GDB的non-stop模式 让破砂锅用一个C+小程序在Ubuntu Linux 09.10下demo这

5、个必杀技。虽然我的demo使用命令行版gdb,如果你喜欢图形化的调试器,Eclipse2009年5月之后的版本可以轻松的调 用这个功能,详情参见Eclipse参见/node/723 1. 编译以下程序nonstop 1/gdbnon-stopmodedemo2/buildinstruction:g+-g-ononstopnonstop.cpp-lboost_thread34#include5#include67structop89op(intid):m_id(id)1011voidoperator()()1213std:coutm_idbeginst

6、d:endl;14std:coutm_idendstd:endl;151617intm_id;18;1920intmain(intargc,char*argv)2122boost:threadt1(op(1),t2(op(2),t3(op(3);23t1.join();t2.join();t3.join();24return0;25262. 把一下3行添加到/.gdbinit来打开non-stop模式 settarget-async1setpaginationoffsetnon-stopon3. 启动gdb,设断点,运行.可以看到主线程1是running,3个子线程都断在断点上,而不是只有一个

7、子线程断在断点上./devroot/nonstop$gdb./nonstopGNUgdb(GDB)7.0-ubuntuReadingsymbolsfrom/home/frankwu/devroot/nonstop/nonstop.done.(gdb)break14Breakpoint1at0x402058:filenonstop.cpp,line14.(gdb)break24Breakpoint3at0x401805:filenonstop.cpp,line24.(gdb)runStartingprogram:/home/frankwu/devroot/nonstop/nonstopThrea

8、ddebuggingusinglibthread_dbenabledNewThread0x7ffff6c89910(LWP2762)NewThread0x7ffff6488910(LWP2763)1beginBreakpoint1,op:operator()(this=0x605118)atnonstop.cpp:1414std:coutm_idendstd:endl;2beginBreakpoint1,op:operator()(this=0x605388)atnonstop.cpp:1414std:coutm_idendstd:endl;NewThread0x7ffff5c87910(LW

9、P2764)3beginBreakpoint1,op:operator()(this=0x605618)atnonstop.cpp:1414std:coutm_idendstd:endl;(gdb)infothreads4Thread0x7ffff5c87910(LWP2764)op:operator()(this=0x605618)atnonstop.cpp:143Thread0x7ffff6488910(LWP2763)op:operator()(this=0x605388)atnonstop.cpp:142Thread0x7ffff6c89910(LWP2762)op:operator(

10、)(this=0x605118)atnonstop.cpp:14*1Thread0x7ffff7fe3710(LWP2759)(running)4. 让线程3继续运行,注意我顾意把主线程1也continue,这是我发现的workaround,否则gdb不能切回thread 1.(gdb)threadapply31continueThread3(Thread0x7ffff6488910(LWP2763):Continuing.Thread1(Thread0x7ffff7fe3710(LWP2759):Continuing.Cannotexecutethiscommandwhiletheselec

11、tedthreadisrunning.2endThread0x7ffff6488910(LWP2763)exitedwarning:Unknownthread3.Thread1(Thread0x7ffff7fe3710(LWP2759):Continuing.Cannotexecutethiscommandwhiletheselectedthreadisrunning.(gdb)infothreads4Thread0x7ffff5c87910(LWP2764)op:operator()(this=0x605618)atnonstop.cpp:142Thread0x7ffff6c89910(LW

12、P2762)op:operator()(this=0x605118)atnonstop.cpp:14*1Thread0x7ffff7fe3710(LWP2759)(running)5. 让另外两个线程继续运行而结束,主线程断在第24行,最后结束.(gdb)threadapply421continueThread4(Thread0x7ffff5c87910(LWP2764):Continuing.Thread2(Thread0x7ffff6c89910(LWP2762):Continuing.Thread1(Thread0x7ffff7fe3710(LWP2759):Continuing.Cannotexecutethiscommandwhiletheselectedthreadisrunning.3end1endThread0x7ffff5c87910(LWP2764)exitedThread0x7ffff6c89910(LWP2762)exitedBreakpoint3,main(argc=1,argv=0x7fffffffe348)atnon

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论