如何对多线程程序进行调试

如何对多线程程序进行调试,方便,高效,简单。(windows 与linux都可)

Geo5
Geo5
463
编辑于2012-02-23
评论 (0)链接2012-02-23 

1.尽量多用工具分析,比如Thread Checker,Thread Profiler,能以较直观的方式发现问题。

2.Bench Testing,先把多线程环境屏蔽掉,先验证逻辑部分有没有问题,如果OK了,再考虑增加多线程相关功能

3.多用assert、条件断点等捕捉错误信息

4.日志记录,打印运行信息和线程的运行次序。

5.内存标记,可以降低干扰,可以快速标识问题线程,找到问题所在

最重要的还是要有耐心,多观察多测试

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-02-23

一是有计划地对付错误。

对应用程序展开适当的调试,应该是远在你使用调试器之前就开始了。多多使用ASSERT调试措施。(ASSERT背后的概念是安全和速度之间的交换。程序运行因此运行得比较慢,但是Debug Build的制造就是为了调试,所以可以理解)在每一个你的假设之处做检验工作。进入一个函数时,确认所有状态。不要只是检查指针是否合法;如果可能,检查一下指针所指的结构中的数据是否一致。

二是Bench Testing

其实这种方法就是先撇开多线程的环境,测试程序逻辑的正确性。如果OK了,然后再考虑与线程相关的东西。

三是线程对话框

这里主要讨论了对一个特定的线程如何调试,方法是挂起所有的线程——除了我们关注的那个。书中介绍的方法在vs 2005我没有找到。

四是日志记录

这里主要是在控制台窗口显示一些运行信息,我们可以使用printf等函数在控制台输出一些信息来查看线程的运行次序。

五是内存记号

使用内存记号的好处就是降低彼此干扰的可能性。但是也要注意它不是同步操作,可能会因为两个线程的同时写入引来问题。

六是硬件调试寄存器

另外推荐你一篇文章:调试多线程应用程序

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-02-23

我一般的调试方法:
一、首先,先把线程函数作为一个独立函数来调试,单步调试完后,再改为线程。这样,会降低调试难度。
二、如果两三个线程需要同步操作,那么先单独用方法1调试完毕,然后再组合。尽可能地将情况简单化,没问题了再增加复杂度。
三、在多个线程运行起来的时候,在关键位置设置断点,断点位置不能太多,用F5别用f10单步运行。跟踪断点位置变量的结果,判断问题所在。

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-02-23

Windows下的VC对多程序的调试比较简单。如果想要对程序进行调试的话,首先F10,开始运行程序。其次,我们需要等线程创建之后才能设置断点,不然我们看到的程序只有main函数一个thread。
1. 单击【Debug】,选择【threads】,那么我们就可以开始多线程调试了;
2. 如果需要对某一个thread挂起,单击对应的thread,选择【suspend】即可;
3. 如果需要对某一个thread重新调度,单击对应的thread,选择【resume】即可;
4. 如果需要查看特定thread的堆栈,那么选择那个thread,然后【Set Focus】,关闭threads对话框,在堆栈窗口中即可看到;
5. 如果某个线程被挂住,那么此时所有的线程都挂住了,如果你step运行,所有的threads都会参与运行;
6. 如果需要对某一个thread进行调试,那么需要对其他的thread进行suspend处理 。

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-02-23

我说说Linux下对多线程进行调试的方法吧。

1、最直接的方法就是在源程序插入printf语句来打印出一些有用的变量。
  这种方法的优点是不用借助其他工具就可以对程序的运行进行观察,缺点是插入语句的位置、粒度等都需要调试者自己去权衡,如果插入过多的打印语句,则频繁的IO操作会使程序运行变慢,线程行为改变,有些bug甚至不会再出现。至于需要在什么地方插入语句,首先,只打印有必要的变量,一个语句可以打印多个变量;其次,在循环中,我们可以通过设置一些条件来降低打印的粒度。

2、利用gdb的attach功能和sleep()函数。
  gdb是由gnu维护的功能强大的调试工具,并且支持多线程程序的调试,可以在gdb下直接运行一个多线程程序,通过thread等命令进行调试。这种方法的好处是能够使gdb对程序执行的影响最小,而且可以只接管程序中某一条我们所关心的线程,而其他线程不受影响。

3、第三种方法是利用信号处理函数来获取一些信息。
多数多线程程序出错,都是访问非法内存,也就是我们常说的“段错误”(segmentation fault),程序发生非法内存的访问,系统会发给线程一个SIGSEGV信号,这个信号默认处理为core掉该线程。

4、利用strace得到我们跟踪程序运行信息,以得到我们有用的信息。
  通过strace打印出的信息,我们可以对什么时候产生了一个子线程,那个线程在等待,哪个线程被唤醒,哪个线程收到信号,哪个线程core掉有一个综合的了解,这些信息对多线程调试会起到很大的作用。

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-02-23

下面说说我调试的方法:
1 首先, 先把线程函数作为一个独立函数来调试, 单步调试完后,再改为线程。
这样, 会降低调试难度。
2 如果两三个线程需要同步操作, 那么先单独用方法1调试完毕, 然后再组合。
尽可能地将情况简单化, 没问题了再增加复杂度。
3 在多个线程运行起来的时候,在关键位置设置断点,断点位置不能太多, 用F5,
别用f10单步运行。 跟踪断点位置变量的结果, 判断问题所在。

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-02-23

jprofiler工具。windows和linux都可以。该工具会显示所有线程的详细信息以及内存和CPU的使用率。

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-02-29
德问是一个专业的编程问答社区,请 登录注册 后再提交答案