我正在调试一个非常大的 Qt-3 应用程序。应用程序进行大量预处理,然后接收 SIGPIPE 信号。一旦我得到 SIGPIPE,我就会写下回溯的一些条目。
#0 .. __write_nocancel () from libpthread.so
#1 .. _IceTransFreeConnInfo () from libICE.so.6
#2 .. _IceWrite () from libICE.so.6
#3 .. _IceFlush () from libICE.so.6
我们的应用程序有一个信号处理程序。我所做的是使用 signal(SIGPIPE, SIG_IGN)
忽略 SIGPIPE,认为即使我收到此信号我的应用程序也会继续。但现在我意识到它不会那样工作,如果我在收到 SIGPIPE 后继续,它就会存在。
我不知道如何调试这个问题。此信号不是来 self 们应用程序直接调用的套接字。它来自 libICE。我对么?请给出一些关于如何调试它的提示。
提前致谢。
最佳答案
信号来自内核,是 write(2)
到文件描述符的结果,接收者要么死了,要么执行了 shutdown(2 )
。
听起来好像您的代码中的某些东西搞砸了属于 libICE.so
而不是您的文件描述符。
您的第一步可能应该是在 strace
下运行应用程序,然后分析日志以查看 libICE
正在写入的 FD 到底是如何被搞砸的.
一旦您知道发生了什么,使用 GDB catch syscall
命令找出它发生的位置。
关于c++ - 调试来自第三方库的 SIGPIPE 信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9111237/