【问题标题】:Debugging a SIGPIPE signal from third party library调试来自第三方库的 SIGPIPE 信号
【发布时间】:2012-02-02 11:06:07
【问题描述】:

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

提前致谢。

【问题讨论】:

  • 当应用程序本身raise()es 发出信号时,您应该能够在调试器中捕捉到它。
  • @PlasmaHH:谁说过raise()

标签: c++ qt gdb signals


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-28
    • 2014-05-17
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 2017-08-06
    相关资源
    最近更新 更多