每当调用malloc/free时输出到stderr

twk*_*twk 4 c++ linux memory malloc valgrind

使用Linux/GCC/C++,我想在调用malloc/free/new/delete时向stderr记录一些内容.我正在尝试理解库的内存分配,因此我想在运行单元测试时生成此输出.我使用valgrind进行内存泄漏检测,但我找不到一个选项来使它只是日志分配.

有任何想法吗?我正在寻找最简单的解决方案.不能重新编译库.

Rob*_*ble 15

您可以使用ltrace跟踪对malloc/free的调用:

#include <stdlib.h>

int 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)                                  = <void>
+++ exited (status 0) +++
Run Code Online (Sandbox Code Playgroud)

要在不重新编译的情况下跟踪新的/删除调用,您可能需要使用类似LD_PRELOAD的内容来覆盖使用您自己的版本的调用,这正是LeakTracer可以执行您想要的操作.


Eme*_*gul 5

本文(向下滚动到底部)提供了如何在C++中覆盖全局newdelete运算符的非常清晰和简洁的描述(请注意,它没有提供示例new[],但它在概念上类似).

至于重写malloc和free,因为你正在使用Linux和GCC,最简单的方法是使用malloc_hookfree_hook. 以下是对这些功能如何工作的非常好的描述.