进程触发double free时的栈信息由谁打印?能否关闭该输出?
关于double free错误输出的组件及关闭方法
问题描述
当进程触发double free错误时,会输出错误信息与栈回溯内容,想了解这些信息由哪个组件打印?若不需要这类输出,是否可以关闭?
测试代码:
// g++ hel.cpp #include <iostream> int main() { int *p = new int; delete p; delete p; return 1; }
运行输出:
*** Error in `./a.out': double free or corruption (fasttop): 0x00000000022ccc20 *** ======= Backtrace: ========= /lib64/libc.so.6(+0x81329)[0x7fb4b3e18329] ./a.out[0x400714] /lib64/libc.so.6(__libc_start_main+0xf5)[0x7fb4b3db9555] ./a.out[0x400629] ======= Memory map: ======== 00400000-00401000 r-xp 00000000 fd:01 7210287 00600000-00601000 r--p 00000000 fd:01 7210287 00601000-00602000 rw-p 00001000 fd:01 7210287 .... Aborted
回答
1. 输出信息的组件
这些错误信息和栈回溯是由GNU C库(glibc)的默认内存分配器ptmalloc2打印的。当内存分配器检测到非法内存操作(比如double free、内存块损坏)时,会在调用abort()终止进程前,输出错误详情、栈回溯和内存映射信息,用于辅助定位问题。栈回溯的生成依赖glibc内置的回溯机制,部分场景下也会调用libbacktrace库完成。
2. 如何关闭这类输出
有几种可行的方法:
- 设置环境变量
MALLOC_CHECK_:
执行程序前通过export MALLOC_CHECK_=0配置,或直接在命令行前追加:MALLOC_CHECK_=0 ./a.out。该变量的取值规则为:0=忽略错误不输出;1=仅打印警告;2=打印错误并终止程序(默认行为)。 - 编译时禁用调试检测:
编译C/C++程序时添加-DNDEBUG选项,该选项会同时禁用assert()宏,仅适用于完全不需要调试检测的场景。 - 替换内存分配器:
链接时使用tcmalloc、jemalloc等第三方内存分配器,这类分配器默认不会打印glibc风格的回溯信息,且有独立的配置开关调整错误处理逻辑。
内容的提问来源于stack exchange,提问作者ryryss
相关产品推荐
相关产品推荐

