使用Linux/GCC/C++,我想在调用malloc/free/new/delete时向stderr记录一些内容.我正在尝试理解库的内存分配,因此我想在运行单元测试时生成此输出.我使用valgrind进行内存泄漏检测,但我找不到一个选项来使它只是日志分配.
有任何想法吗?我正在寻找最简单的解决方案.不能重新编译库.
您可以使用ltrace跟踪对malloc/free的调用:
#includeint main (void) { void *ptr = malloc(10); free(ptr); return 0; } $ g++ test.cpp -o test $ ltrace -e malloc,free ./test malloc(10) = 0x804a008 free(0x804a008) = +++ exited (status 0) +++
要在不重新编译的情况下跟踪新的/删除调用,您可能需要使用类似LD_PRELOAD的内容来覆盖使用您自己的版本的调用,这正是LeakTracer可以执行您想要的操作.
本文(向下滚动到底部)提供了如何在C++中覆盖全局new
和delete
运算符的非常清晰和简洁的描述(请注意,它没有提供示例new[]
,但它在概念上类似).
至于重写malloc和free,因为你正在使用Linux和GCC,最简单的方法是使用malloc_hook
和free_hook
. 以下是对这些功能如何工作的非常好的描述.