调试来自第三方库的SIGPIPE信号

时间:2012-02-02 11:06:08

标签: c++ qt gdb signals

我正在调试一个非常大的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。我对么?请提供一些关于如何调试它的提示。

提前感谢。

1 个答案:

答案 0 :(得分:1)

信号来自内核,是write(2)文件描述符的结果,接收方已经死亡或执行了shutdown(2)

听起来你的代码中的某些东西搞砸了属于libICE.so的文件描述符,而不是你。

您的第一步应该是在strace下运行该应用程序,然后分析日志以确切了解libICE正在编写的FD是如何被搞砸的。

一旦你知道发生了什么,请使用GDB catch syscall命令找出发生在哪里