我正在调试一个非常大的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之后继续存在它就会存在。
我对如何调试此问题毫无头绪。此信号不是源自我们的应用程序直接的套接字调用。它来自libICE。我对么?请提供一些关于如何调试它的提示。
提前感谢。
答案 0 :(得分:1)
信号来自内核,是write(2)
文件描述符的结果,接收方已经死亡或执行了shutdown(2)
。
听起来你的代码中的某些东西搞砸了属于libICE.so
的文件描述符,而不是你。
您的第一步应该是在strace
下运行该应用程序,然后分析日志以确切了解libICE
正在编写的FD是如何被搞砸的。
一旦你知道发生了什么,请使用GDB catch syscall
命令找出发生在哪里。