Solaris 程序在空闲时因 SIGABRT 而崩溃

Posted

技术标签:

【中文标题】Solaris 程序在空闲时因 SIGABRT 而崩溃【英文标题】:Solaris program crashes with SIGABRT when idle 【发布时间】:2015-01-20 05:12:43 【问题描述】:

我在 solaris 中的一个程序突然崩溃,使用 SIGABRT 在日志中没有任何痕迹

以下是核心转储

threading model: multi-threaded
status: process terminated by SIGABRT (Abort)
C++ symbol demangling enabled
libc.so.1`_lwp_kill+0xa()
libc.so.1`raise+0x19()
libc.so.1`abort+0x90()
libCrun.so.1`void __Cimpl::default_terminate+9() 
libCrun.so.1`void __Cimpl::ex_terminate+0x25() 
libCrun.so.1`void __Crun::ex_throw+0x26() 
libTAO.so.2.0.7`void TAO_ORB_Core::check_shutdown+0x4c()
0x319c9a8()

代码似乎没有问题,因为进程在空闲时突然崩溃。

然后我决定查看系统日志,发现以下消息

[ID 702911 auth.error] [22216] Run idle timeout reached (32400 seconds)

知道为什么会这样吗?

【问题讨论】:

您的程序中似乎出现了未处理的异常。恐怕没有人能说出为什么没有源代码。 这到底是什么程序?你有源代码吗?你能在源代码中grep -r "Run idle timeout reached"吗? 确保当另一个异常已经在传播时,您不会从析构函数中抛出任何异常。如果您使用RAII 模式,就会发生这种情况。如果你的代码抛出异常,那么你的“守卫”的析构函数将被调用,它会爆炸。当然只是基于堆栈帧的疯狂猜测(您试图抛出但运行时调用立即终止)。我们真的需要看看源头。 【参考方案1】:

SIGABRT 被引发是因为您有一个未处理的异常。堆栈跟踪会告诉您异常来自何处:

void TAO_ORB_Core::check_shutdown()

该函数的documentation 表示,如果 ACE ORB 已关闭,它将引发异常,这意味着程序需要终止。那么问题就变成了,为什么您的应用程序逻辑会在 ORB 达到“超时”时关闭它?这就是你需要深入研究你的应用程序才能找到的东西——我认为我们没有这方面的来源。

【讨论】:

您对 ORB 运行的调用是否有尝试/捕捉? @JohnnyWillemsen:如果 OP 这样做,那是针对某些异常类型,而不是在此处抛出的异常类型。 try/catch 可以避免 SIGABRT 但我不确定它是否能解决真正的问题,这似乎是“为什么程序会停止?” @John Zwinck 感谢您提供的线索 // CORBA::ORB *orb; orb->run() // 这在内部调用 TAO_ORB_Core::check_shutdown。正如您所指出的,如果 ORB 关闭,这将引发异常。我发现 ORB 在超时时实际上正在关闭。 (我必须弄清楚为什么会这样)我会尝试添加一个 try, catch 块来暂时捕获这个异常。 // try orb->run(); catch(CORBA::SystemException&) cout

以上是关于Solaris 程序在空闲时因 SIGABRT 而崩溃的主要内容,如果未能解决你的问题,请参考以下文章

开发人员 ID 签名的 OS X 应用程序在启动时因代码签名无效而崩溃

使用 d3.json 查询 sinatra 应用程序在 localhost 上工作正常,但在部署时因禁止而失败

避免在调试模式 Access 97 时因错误而停止

xcode 在更新 UI 文本字段时因读取而崩溃

在阿里5年和百度2年的程序员,面试一家小公司时因没有第一时间给出答案而“挂了”

Fossil 在提交时因“数据库已锁定错误”而崩溃