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

标签 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 后继续,它就会存在。

我不知道如何调试这个问题。此信号不是来 self 们应用程序直接调用的套接字。它来自 libICE。我对么?请给出一些关于如何调试它的提示。

提前致谢。

最佳答案

信号来自内核,是 write(2) 到文件描述符的结果,接收者要么死了,要么执行了 shutdown(2 )

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

您的第一步可能应该是在 strace 下运行应用程序,然后分析日志以查看 libICE 正在写入的 FD 到底是如何被搞砸的.

一旦您知道发生了什么,使用 GDB catch syscall 命令找出它发生的位置

关于c++ - 调试来自第三方库的 SIGPIPE 信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9111237/

相关文章:

c++ - 我在哪里可以找到与 Clang 假设的目录结构相同的 mingw32?

c++ - zmq 呼吸机/ worker /水槽范式不适用于/子进程

c++ - 为使用多种语言编译的程序公开调试符号

c++ - 用于 Arduino IDE (xtensa-lx106-elf-gcc) 和 std::map 链接错误的 ESP8266

qt - 如何将标题设置为 QListView

c++ - 将 QWidgets 放置在指定的坐标?

c++ - Qt/C++制作可编辑流程图

c++ - 为什么socket在gdb下会失败?

linux - 如何使用 gdbserver 进行远程调试?

c++ - 线程 1:启动 std::pair 数组时出现 EXC_BAD_ACCESS