malloc 调用 realloc,然后崩溃
malloc calls realloc, then crashes
我在 linux 嵌入式设备中使用守护程序,守护程序在 运行 时随机崩溃,通常在启动几个小时后。我调查了崩溃报告(堆栈转储)并检测到它因 2 种情况而崩溃,请遵循以下调用跟踪:
- 案例 1. 我的函数 -> calloc -> malloc -> realloc(因 SIGSEGV 而崩溃)
- 案例 2. 我的函数 -> calloc -> malloc -> realloc -> 中止 ->
提高(SIGABRT 崩溃)
我读了这个 link 我的问题似乎是因为堆损坏 Why do I get a C malloc assertion failure?。
我为内存分配函数(malloc、calloc、realloc 和 free)制作了自己的包装器版本,以在分配的内存周围附加栅栏并通过哈希监视它们 table,因此我可以检测缓冲区溢出或免费两次。但是它仍然在我的栅栏上没有任何内存冲突的情况下崩溃。
所以我想问2个问题:
- 你有什么办法调试这类问题吗?
- malloc什么时候调用realloc?我简单地查看了 glibc 上的 malloc 源代码,没有看到对 realloc 的调用。
我的同事找到了根本原因(通过调查核心转储文件和 libc malloc 的源代码),有一点是 写入释放的内存 因为一个错误链表的删除函数 => 损坏的内存 => calloc 崩溃。
实际上malloc不调用realloc,malloc调用__malloc_consolidate 代替。在 libc 的 obj 转储文件中,__malloc_consolidate' 的 asm 代码在 realloc 的 asm 代码下面,所以我虽然 malloc 调用 realloc.
我在 linux 嵌入式设备中使用守护程序,守护程序在 运行 时随机崩溃,通常在启动几个小时后。我调查了崩溃报告(堆栈转储)并检测到它因 2 种情况而崩溃,请遵循以下调用跟踪:
- 案例 1. 我的函数 -> calloc -> malloc -> realloc(因 SIGSEGV 而崩溃)
- 案例 2. 我的函数 -> calloc -> malloc -> realloc -> 中止 ->
提高(SIGABRT 崩溃)
我读了这个 link 我的问题似乎是因为堆损坏 Why do I get a C malloc assertion failure?。
我为内存分配函数(malloc、calloc、realloc 和 free)制作了自己的包装器版本,以在分配的内存周围附加栅栏并通过哈希监视它们 table,因此我可以检测缓冲区溢出或免费两次。但是它仍然在我的栅栏上没有任何内存冲突的情况下崩溃。
所以我想问2个问题:
- 你有什么办法调试这类问题吗?
- malloc什么时候调用realloc?我简单地查看了 glibc 上的 malloc 源代码,没有看到对 realloc 的调用。
我的同事找到了根本原因(通过调查核心转储文件和 libc malloc 的源代码),有一点是 写入释放的内存 因为一个错误链表的删除函数 => 损坏的内存 => calloc 崩溃。
实际上malloc不调用realloc,malloc调用__malloc_consolidate 代替。在 libc 的 obj 转储文件中,__malloc_consolidate' 的 asm 代码在 realloc 的 asm 代码下面,所以我虽然 malloc 调用 realloc.