【问题标题】:core dump in mallocmalloc 中的核心转储
【发布时间】:2021-12-06 16:40:34
【问题描述】:

我正在观察 libc.so 中的核心转储,其堆栈跟踪如下。

#6271 0xb8df in raise () from /lib64/libc.so.6
#6272 0x5cf5 in abort () from /lib64/libc.so.6
#6273 0xec17 in __libc_message () from /lib64/libc.so.6
#6274 0x553c in malloc_printerr () from /lib64/libc.so.6
#6275 0x83cc in _int_malloc () from /lib64/libc.so.6
#6276 0x9937 in malloc () from /lib64/libc.so.6
#6277 0x9dff in jsonp_malloc () from jansson
#6278 0xce06 in json_array () from jansson
#6279 0x9555 in parse_value () from jansson
#6280 0x9484 in parse_value () from jansson
#6281 0x9484 in parse_value () from jansson
#6282 0x9739 in parse_json () from jansson
#6283 0x9d88 in json_loads () from jansson

有人可以帮助我解决问题吗?或任何类型的怀疑出了什么问题?

【问题讨论】:

  • malloc() 不可重入。这可能会导致麻烦,即使在做一些简单的事情(例如从信号处理程序中调用 printf()

标签: unix malloc coredump


【解决方案1】:

我正在观察 libc.so 中的核心转储,其堆栈跟踪如下。

malloc_printerr 可能stderr 上打印了一些错误消息,例如double-free detected 之类的。

无论如何,这次崩溃是malloc 检测到某种堆损坏的结果(溢出堆缓冲区、freeing 未分配内存、freeing 两次等)

使用core 转储几乎不可能调试这些类型的错误,因为它们通常发生在执行的很晚,有时在完全不相关的代码中。

幸运的是,专门的工具通常可以很容易地找到这些错误。

您应该首先使用gcc -fsanitize=address ... 构建应用程序并运行您的测试套件。如果幸运的话,这将暴露错误。

另一个可以提供帮助的工具(不需要重新构建,但捕获的错误更少)是Valgrind

【讨论】:

    猜你喜欢
    • 2020-12-08
    • 1970-01-01
    • 2020-01-31
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多