【问题标题】:Debugging signal handling in multithreaded application在多线程应用程序中调试信号处理
【发布时间】:2012-09-30 20:07:17
【问题描述】:

我有这个使用 pthreads 的多线程应用程序。我的线程实际上使用 sigwait 等待信号。实际上,我想调试我的应用程序,看看哪个线程在什么时间接收到哪个信号,然后调试它。有什么方法吗,我可以做到。如果我直接运行我的程序,那么信号会迅速生成并由我的处理程序线程处理。我想看看哪个处理程序从 sigwait 调用中唤醒并处理信号和所有。

【问题讨论】:

    标签: c multithreading debugging signals


    【解决方案1】:

    方便的strace 实用程序可以打印出大量有关系统调用和信号的有用信息。记录时间信息或收集有关信号使用性能的统计信息会很有用。

    如果您有兴趣在特定信号触发的事件中获取断点,则可以考虑存储足够的相关信息以在变量中识别事件并设置conditional breakpoint.

    【讨论】:

    • 是否可以在我的线程中使用 eclipse 并使用断点。我不确定这是否可行。信号是连续生成的,我先阻塞它们,然后使用 sigwait 同步访问它们
    • 好吧,在调试器(尤其是断点)下运行程序可能会显着改变异步事件的时序模式。如果您想准确了解计时的实际工作原理,我会在没有附加调试器的情况下运行它。
    【解决方案2】:

    您可以尝试使用 gdb 的其中一件事是按线程设置断点(例如,在从 sigwait 返回之后),这样您就知道哪个线程被唤醒了:

    break file.c thread [thread_nr]
    

    不要忘记告诉 gdb 将信号传递给您的程序,例如:

    handle SIGINT pass
    

    您可能希望将所有这些都放入您的 .gdbinit 文件中以节省大量输入。

    Steven Schlansker 绝对正确:如果这恰好显着改变了您程序的时序模式(因此您可以看到您的程序在调试器下的行为与“在野外”完全不同)然后 strace伐木是你最后的希望。 我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多