【问题标题】:Debugging C program with multiple threads使用多线程调试 C 程序
【发布时间】:2011-09-14 07:11:20
【问题描述】:

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

所以我从 gdb 开始。一旦我输入运行,服务器似乎在后台运行,但 gdb 返回提示和“程序收到信号 SIG64(实时事件 64)”消息(我猜与 pthread 相关)。我知道它必须与 main 被分叉成几个线程有关。但我不知道如何调试它。任何起点都会很有帮助。

另外,我可以使用其他一些“跟踪”,如调试器、占用空间小吗?

请帮忙

【问题讨论】:

    标签: c debugging gdb


    【解决方案1】:

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

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

    【讨论】:

    • 考虑到程序的多线程特性,补充一点是有意义的,在使用调试打印时,不要依赖不同线程之间的打印顺序。
    • @als :在这种情况下,最好有一个“记录器”线程,您可以在其中发送要打印的消息(例如通过 msgqueue)。记录器线程为消息添加时间戳并按从 msg 队列接收它们的顺序打印它们。
    • 很好的建议泽维尔。也许我必须尝试一下:)
    • 如果问题只是由于保持多线程而出现,那么将错误隔离到单线程案例和研究是没有用的
    • @Xavier:这确实是一个好建议,虽然它对计时敏感问题没有多大帮助,但值得一试。
    【解决方案2】:

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

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

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

    3. 如果您使用的是互斥锁,请检查它是否不会造成死锁。在条件和信号量设计中,总是尝试在纸上跟踪所有这些线程。

    【讨论】:

      【解决方案3】:

      我推荐你使用像 valgrind 这样的内存访问检查程序。就我而言,许​​多错误是由非法内存处理引起的。在多线程程序上很难找到错误,因此使用内存泄漏检查程序是找出错误原因的更好方法。

      【讨论】:

      • Valrgrind 可能无法在带有 BusyBox 的嵌入式 Linux 上运行。
      • @Eli lser 我尝试在 s3c6410 嵌入式板上使用 valgrind。编译成功但实际上我未能加载 valgrind,因为某些共享对象版本与 valgrind 不匹配。如果busybox他包含正确的so文件,它将起作用。
      • 我用 -lmcheck 编译了我的代码并解决了几个“泄漏”指针:)
      【解决方案4】:

      一些棘手的想法..

      1. 将睡眠(有时)添加到要调试的线程中作为起点
      2. 程序运行后,检查线程的pid(使用带有-L选项的ps)
      3. 在 gdb 提示符下运行 gdb 程序 {pid} 或调用 attach {pid}
      4. 睡眠后,您可以跟踪该线程的下一步

      别忘了附加必须在睡眠时间结束之前完成。

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

      【讨论】:

        【解决方案5】:

        GDB 有一些用于调试多线程的函数。例如,您可以运行命令i threads 来查看当前存在的线程。这是一个可能有用的链接:https://ftp.gnu.org/old-gnu/Manuals/gdb/html_node/gdb_24.html

        【讨论】:

          猜你喜欢
          • 2011-09-12
          • 2016-09-01
          • 2017-12-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-24
          相关资源
          最近更新 更多