我有这个使用 pthreads 的多线程应用程序。我的线程实际上使用 sigwait 等待信号。实际上,我想调试我的应用程序,看看哪个线程在什么时间接收到哪个信号,然后调试它。有什么方法吗,我可以做到。如果我直接运行我的程序,那么信号会快速生成并由我的处理程序线程处理。我想看看哪个处理程序从 sigwait 调用中唤醒并处理信号和所有。
2 回答
The handy strace utility can print out a huge amount of useful information regarding system calls and signals. It would be useful to log timing information or collect statistics regarding the performance of signal usage.
If instead you are interested in getting a breakpoint inside of an event triggered by a specific signal, you could consider stashing enough relevant information to identify the event in a variable and setting a conditional breakpoint.
您可以使用 gdb 尝试的其中一件事是按线程设置断点(例如,在从 sigwait 返回之后),这样您就知道哪个线程被唤醒了:
break file.c thread [thread_nr]
不要忘记告诉 gdb 将信号传递给您的程序,例如:
handle SIGINT pass
您可能希望将所有这些都放入您的.gdbinit文件中,以节省大量输入。
Steven Schlansker 绝对正确:如果这恰好显着改变了程序的时序模式(因此您可以看到您的程序在调试器下的行为与“在野外”完全不同),那么strace和日志记录是您最后的希望。我希望这会有所帮助。