2015-10-06 118 views
0

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

现在,根据我对信号的了解,线程应调用SIG_DFLSIGSEGV,这是异常终止进程和coredump。然而,我看到这个过程仍然活着(处于一种不灵活的状态),执行停止,但过程仍然存在。当我试图kill它时,SIGTERM实际上传播到我的自定义信号处理程序(它试图很好地关闭所有线程),但它挂起,因为没有任何线程实际上执行了。我终于设法使用SIGQUIT杀死它,并在那之后生成了核心文件。

所以我的问题是“异常终止”是什么意思?如果SIG_DFL被称为SIGSEGV,如何不能从内存中删除进程?可能会发生什么导致这种行为?我的Linux是红帽企业Linux服务器版本5.11(Tikanga)

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

+0

你说你有一个自定义信号手柄,它有什么作用? – Adam

+0

SIGTERM的预期行为是终止进程,但可以捕获SIGTERM并执行其他操作。 SIGKILL是不可撤销的强制退出。即'kill -9 12345' – Adam

+0

另外,有没有'ps'列出你的程序为?如果是这样,这是一个僵尸进程(即它退出,但它的返回值尚未被启动过程读取)。 – Adam

回答

0

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