libc 退出调用中的核心转储

Posted

技术标签:

【中文标题】libc 退出调用中的核心转储【英文标题】:Core dump in libc exit call 【发布时间】:2011-01-28 10:56:19 【问题描述】:

在我的程序退出过程中,我在 solaris 中看到一个核心转储。如何调试和修复这种核心转储?

(gdb) where
#0  0xff2cc0c0 in kill () from /usr/lib/libc.so.1
#1  0x0004dac0 in run_before_killed_handler (sig=11) at NdmpServer.cpp:1186
#2  signal handler called
#3  0xfee0ad50 in ?? ()
#4  0x00060a6c in proc_cleanup ()
#5  0xff2421ac in _exithandle () from /usr/lib/libc.so.1
#6  0xff2305d8 in exit () from /usr/lib/libc.so.1
#7  0x0003431c in _start ()

【问题讨论】:

您可以先告诉我们NdmpServer.cpp:1186 行的内容。然后沿着回溯工作,直到找到问题。 proc_cleanup 也可能有用。 run_before_killed_handler (NdmpServer.cpp:1186) 是所有信号的 sig 处理程序。 sig 11 是 SIGSEV 【参考方案1】:

您的程序显然使用atexit(3C) 来注册退出处理程序。该处理程序出现问题。

【讨论】:

【参考方案2】:

在不了解 Solaris 内存布局的详细信息的情况下,0xfee0ad50 似乎在操作系统方面。您在proc_cleanup 中尝试(并且失败)了什么操作系统调用?

【讨论】:

以上是关于libc 退出调用中的核心转储的主要内容,如果未能解决你的问题,请参考以下文章

什么组件实际上转储核心?

如何获取已向已退出转储核心的另一个进程发送 SIGABRT 信号的进程的 pid

libc-2.20.so 的核心转储

如何以线程安全的方式退出 C++03 中的程序?

没有为 systemd 服务生成核心转储

你怎么知道main是不是已经退出?