【问题标题】:SIGSEGV does not terminate the processSIGSEGV 不会终止进程
【发布时间】:2015-10-06 17:38:23
【问题描述】:

我有一个运行 30 多个线程的多线程应用程序。我知道有一个错误,有时两个线程尝试同时对一个列表进行排序,这通常会导致其中一个线程访问无效内存。因此,为该线程生成了一个SIGSEGV

现在,根据我对信号的理解,线程应该为SIGSEGV 调用SIG_DFL,这是进程的异常终止和核心转储。但是,我看到执行停止的进程仍然存在(处于一种不确定状态),但进程仍然存在。当我尝试kill 它时,SIGTERM 实际上已传播到我的自定义信号处理程序(它试图很好地关闭所有线程),但它挂断了,因为实际上没有线程正在执行。我终于设法使用SIGQUIT 将其杀死,然后生成了核心文件。

所以我的问题是“异常终止”是什么意思?如果为SIGSEGV 调用SIG_DFL,如何不从内存中删除进程?可能会发生什么导致这种行为?我的 Linux 是 Red Hat Enterprise Linux Server release 5.11 (Tikanga)

编辑:我(或多或少)知道如何调试它,我什至知道错误是什么。我的问题或多或少:当使用 SIGSEGV 调用 SIG_DFL 时,RedHat 究竟做了什么?这里的问题是进程没有响应,但也没有死——因此自动重启程序没有启动,我们有一些不愉快的停机时间。

【问题讨论】:

  • 你说你有一个自定义的信号处理器,它是做什么的?
  • SIGTERM 的预期行为是终止进程,但可以捕获 SIGTERM 并执行其他操作。 SIGKILL 是无法捕获的强制退出。即kill -9 12345
  • 另外,ps 是否将您的进程列为 ?如果是这样,它是一个僵尸进程(即它退出但它的返回值还没有被启动进程读取)。
  • 你pstack了吗?这应该是第一件事。
  • @ADAM 自定义处理程序通知其他线程释放他们可能持有的数据库连接。下次我会尝试“ps”。

标签: c++ linux multithreading


【解决方案1】:

情况并不像我想象的那么简单。最初的问题是两个线程之间的死锁。当我发出 SIGTERM 时,实际上我的自定义信号处理程序在(现在未)死锁的线程中导致了段错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多