【发布时间】:2018-11-13 14:32:19
【问题描述】:
我正在使用 linux 嵌入式设备中的守护程序,守护程序在运行时随机崩溃,通常在启动几个小时后。我调查了崩溃报告(堆栈转储)并检测到它在 2 种情况下崩溃,请遵循以下调用跟踪:
- 案例 1. 我的函数 -> calloc -> malloc -> realloc(SIGSEGV 崩溃)
- 案例 2. 我的函数 -> calloc -> malloc -> realloc -> abort ->
raise(SIGABRT 崩溃)
我阅读了这个链接,我的问题似乎是因为堆损坏Why do I get a C malloc assertion failure?。
我为内存分配函数(malloc、calloc、realloc 和 free)制作了自己的包装器版本,以在分配的内存周围附加栅栏并通过哈希表对其进行监控,因此我可以检测缓冲区溢出或释放两次。但是它仍然在我的栅栏上没有任何内存冲突而崩溃。
所以我想问两个问题:
- 您有什么想法可以调试此类问题吗?
- malloc 何时调用 realloc?我简单地查看了 glibc 中的 malloc 源代码,发现没有调用 realloc。
【问题讨论】:
-
如果您能够在托管的 Linux 机器上运行代码,请在 valgrind 下运行它。它会告诉你内存管理不善的地方。
-
你能用一个小测试用例重新创建它吗?代码是否运行用户空间?
-
代码是否总是检查
calloc、malloc和realloc的结果是否分配失败? -
如果
malloc调用realloc,它可能将malloc(size)实现为realloc(NULL, size)。 -
您检测到缓冲区溢出或空闲两次 - 但您是否检测到 free not mallocated?
标签: c crash malloc embedded-linux