【问题标题】:malloc calls realloc, then crashesmalloc 调用 realloc,然后崩溃
【发布时间】: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)制作了自己的包装器版本,以在分配的内存周围附加栅栏并通过哈希表对其进行监控,因此我可以检测缓冲区溢出或释放两次。但是它仍然在我的栅栏上没有任何内存冲突而崩溃。

所以我想问两个问题:

  1. 您有什么想法可以调试此类问题吗?
  2. malloc 何时调用 realloc?我简单地查看了 glibc 中的 malloc 源代码,发现没有调用 realloc。

【问题讨论】:

  • 如果您能够在托管的 Linux 机器上运行代码,请在 valgrind 下运行它。它会告诉你内存管理不善的地方。
  • 你能用一个小测试用例重新创建它吗?代码是否运行用户空间?
  • 代码是否总是检查callocmallocrealloc的结果是否分配失败?
  • 如果malloc 调用realloc,它可能将malloc(size) 实现为realloc(NULL, size)
  • 您检测到缓冲区溢出或空闲两次 - 但您是否检测到 free not mallocated

标签: c crash malloc embedded-linux


【解决方案1】:

我的同事找到了根本原因(通过调查核心转储文件和 libc malloc 的源代码),有一点是它写入已释放的内存,因为链表的删除功能中的错误=> 损坏的内存 => calloc 崩溃。

实际上malloc不调用reallocmalloc调用__malloc_consolidate。在 libc 的 obj 转储文件中,__malloc_consolidate' 的 asm 代码在 realloc 的 asm 代码下,所以我虽然 malloc 调用了 realloc。

【讨论】:

    猜你喜欢
    • 2013-08-23
    • 1970-01-01
    • 2012-03-05
    • 2016-06-25
    • 2018-12-22
    • 1970-01-01
    • 2018-07-24
    • 2011-08-13
    • 1970-01-01
    相关资源
    最近更新 更多