尽管系统有很多可用内存,但在执行 malloc 时 fopen 在 RHEL 5.x 中崩溃

fopen crashing in RHEL 5.x while doing malloc though system has lot of available memory

我有一个应用程序在过去 15 天里 运行 正常,下面的函数被多次调用,但它今天在 fopen 中崩溃了。我在下面粘贴了 bt,有人能告诉我可能发生了什么错误吗,从回溯来看,它似乎不是内存损坏,因为所有线程数据和堆栈变量看起来都不错。它可能与 RHEL 中的某些错误有关 5.x

>>(gdb) bt
>>#0  0x00fe4410 in __kernel_vsyscall ()
>>#1  0x0057ab10 in raise () from /lib/libc.so.6
>>#2  0x0057c421 in abort () from /lib/libc.so.6
>>#3  0x005b367b in __libc_message () from /lib/libc.so.6
>>#4  0x005bc8bd in _int_malloc () from /lib/libc.so.6
>>#5  0x005be247 in malloc () from /lib/libc.so.6
>>#6  0x005aa8ef in __fopen_internal () from /lib/libc.so.6
>>#7  0x005aa9bc in fopen@@GLIBC_2.1 () from /lib/libc.so.6
>>#8  0x0811cbff in file_timer_expiry (p_mod_ctx=0xb07e4c8, p_timer_ctx=0x7ce78368) 
>>#9  0x08117c33 in timer_handler (timerId=0xad54aa50, p_timer_info=0x7ce78368, p_module_context=0xb07e4c8)
>>#10 0x08397b43 in ProcessTimerTable (vc=0xae6edb8, nw=0xa89fd380)
>>#11 0x0839974c in Schedule (nw=0xa89fd380, f=0x832027e <BaseUpdate>, ctxt=0x9955e98)
>>#12 0x080730a1 in DriverWhile (p_info=0x95f68c8, W=0x84a698c, policy=2 '[=11=]2')
>>#13 0x080732e1 in start_id (args=0x95f68c8)
>>#14 0x006e7912 in start_thread () from /lib/libpthread.so.0
>>#15 0x0062747e in clone () from /lib/libc.so.6
>>#16 0x00000000 in ?? ()

malloc 实现中的崩溃(在 99.99% 的情况下)是堆损坏的结果。

很可能您的程序打印了一条消息,类似于

glibc detected ./a.out: double free or corruption (!prev): 0x0000000000c6ed50

到它 运行 所在的终端。

要查找堆损坏,请使用 Valgrind or (better) Address Sanitizer(最新版本的 GCC 和 Clang 支持)。