使用多个线程调试C程序

时间:2011-09-14 07:11:20

标签: c debugging gdb

我想调试运行多个TCP服务器线程的C程序。我无法设置复杂的调试工具,因为我必须在嵌入式Linux(忙箱)中进行调试。我希望它原生支持gdb。

所以我开始使用gdb。一旦我键入运行,服务器似乎在后台运行,但gdb返回提示和“程序接收信号SIG64(实时事件64)”消息(与猜测相关的pthread)。我知道它必须与主要分叉到几个线程。但我不知道如何调试这个。任何起点都会非常有用。

另外,是否还有其他“跟踪”类似调试器,我可以使用的占用空间小?

请帮忙

4 个答案:

答案 0 :(得分:6)

通常,使用调试器调试多线程应用程序很困难。最好的方法是尝试将错误隔离到单线程的情况,或者在可疑位置使用调试打印,直到发现错误。

这对您的具体问题毫无帮助,但这是我在使用多线程应用程序时学到的最佳建议,尤其是嵌入式应用程序。

答案 1 :(得分:2)

在这种情况下,我通常会这样做:

  1. 创建一个线程明智的日志文件,并在该日志文件中重定向所有stdoutstderr ... 也许这会对你有所帮助:In multi thread application how can i redirect stderr & stdout in separate file as per thread?

  2. 跟踪所有线程之间的全局变量。不正确地使用全局变量往往会导致问题。

  3. 如果您使用的是互斥锁,请检查它是否会产生死锁。在条件和&信号量设计总是试图跟踪纸上的所有线程。

答案 2 :(得分:1)

我建议您使用像valgrind这样的内存访问检查程序。就我而言,许​​多错误都是由非法内存处理引起的。很难找到多线程程序的bug,所以使用内存泄漏检查程序是找出错误原因的更好方法。

答案 3 :(得分:0)

一些棘手的想法..

  1. 将休眠(有时)添加到线程中作为起点进行调试
  2. 程序运行后,检查线程的pid(使用带-L选项的ps)
  3. 运行gdb程序{pid}或在gdb提示符中调用attach {pid}
  4. 睡觉后,你可以追踪该线程的下一步
  5. 不要忘记必须在睡眠时间结束前完成附着。

    如上所述,单线程测试或使用文本记录工具是不错的选择。