覆盖glibc崩溃

覆盖glibc崩溃,c,stack-trace,glibc,C,Stack Trace,Glibc,因此,当glibc崩溃时,它会显示一条*glibc检测到的*崩溃消息。然后它会打印一堆回溯,比如 *** glibc detected *** ./odin: free(): invalid pointer: 0xbfba4444 *** ======= Backtrace: ========= /lib/tls/i686/cmov/libc.so.6(+0x6b161)[0xb75f9161] /lib/tls/i686/cmov/libc.so.6(+0x6c9b8)[0xb75fa9b8]

因此,当glibc崩溃时,它会显示一条*glibc检测到的*崩溃消息。然后它会打印一堆回溯,比如

*** glibc detected *** ./odin: free(): invalid pointer: 0xbfba4444 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(+0x6b161)[0xb75f9161]
/lib/tls/i686/cmov/libc.so.6(+0x6c9b8)[0xb75fa9b8]
/lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0xb75fda9d]
/usr/lib/libstdc++.so.6(_ZdlPv+0x1f)[0xb77da2ef]
一切都很好,但在其他情况下,当事情崩溃时,我一直在做backtrace(),然后使用系统调用addr2line并在函数中打印实际点。但当它是glibc崩溃时,它会跳过我调用的任何信号处理程序


有没有一种方法可以钩住这些glibc崩溃?

这是内存函数的一个选项,您可以使用来切换它。根据它的声音,您希望将
M_CHECK_ACTION
设置为零以允许继续执行,除非您希望程序立即退出,在这种情况下,请查看
2
是否允许您执行您想要的操作

此小程序产生正常的glibc错误:
这一个忽略错误并继续执行:

这一个在错误时中止:

IIRC,glibc实际上调用了
abort()
,因此处理
SIGABRT
并从中打印回溯应该可以提供所需的信息

然而,我建议你试试valgrind:你得到的信息表明你有内存损坏问题


旁注(如果这是多余的,很抱歉;-):核心转储有时比回溯更有用。它们可以通过在bash中设置
ulimit-c unlimited
来启用。当程序崩溃时,它将生成一个名为
core.
(或者只是
core
——这取决于您正在运行的系统;如果您的系统运行abrtd,如果我没有弄错的话,核心文件将放入
/var/cache/abrt
)。然后,您可以通过运行
gdb-c core a.out
,使用gdb检查核心文件;gdb会话看起来就像进程崩溃了一样。

Hmm,我的程序已经有信号(SIGABRT,blah)很长一段时间了,他们没有触发(他们会打印一堆东西)编辑:他们确实触发了,我只是没看到。我也会尝试valgrind,但我所做的一切都没有被发现。