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 上工作正常,但在部署时因禁止而失败