c++ - Valgrind 和 QEMU - 无法检测内存泄漏

标签 c++ memory valgrind qemu cpputest

我想使用 Valgrind (memcheck) x86 测试我的 C++ 代码是否存在内存泄漏。

但是该软件经过交叉编译并在 ARM 上运行。

为了进行一些自动化测试,我决定通过 QEMU 模拟我的 ARM 硬件。

我还决定使用 cpputest 单元测试 ARM 二进制文件来确保确定性行为并在单元测试涵盖的范围内搜索内存泄漏。

总而言之,我有一个 ARM 二进制文件,应该通过 QEMU 用户模式进行模拟。

我的通话如下所示:

./valgrind --smc-check=all qemu-arm-static -L ... arm-ptest-binary

我的 C++ 代码看起来像这样。它有 20 字节的内存泄漏,当与 QEMU 一起使用时,valgrind 调用不会发现此泄漏。 在我插入内存分配并且没有释放机制后,我预计会发生内存泄漏

int test_func ()
{
  int *foo;
  foo = new int [5];
  printf("test_func called!\n");
  return 1;
}

Valgrind 输出:

==19300== HEAP SUMMARY:
==19300==     in use at exit: 1,103,129 bytes in 2,316 blocks
==19300==   total heap usage: 4,259 allocs, 1,943 frees, 1,866,916 bytes allocated
==19300== 
==19300== LEAK SUMMARY:
==19300==    definitely lost: 0 bytes in 0 blocks
==19300==    indirectly lost: 0 bytes in 0 blocks
==19300==      possibly lost: 304 bytes in 1 blocks
==19300==    still reachable: 1,102,825 bytes in 2,315 blocks
==19300==         suppressed: 0 bytes in 0 blocks
[...]

当我在 ARM 硬件上运行此程序时,valgrind-arm 发现具有完全相同的二进制文件的泄漏。

你们中有人知道为什么 Valgrind 与 QEMU 用户模式结合使用时找不到内存泄漏吗?

提前致谢

最佳答案

您在 QEMU 本身上运行 Valgrind,这将导致 valgrind 报告 QEMU 自己的代码中的内存泄漏,但 valgrind 没有足够的可见性了解 QEMU 下运行的 guest 程序正在执行的操作,因此无法报告 guest 中的泄漏。特别是,Valgrind 通过拦截对 malloc、free、operator new 等的调用来工作——它将为主机 QEMU 进程的 (x86) 分配和 free 调用执行此操作,但无法拦截 guest 的 (arm) 调用流程使得。

您可能会考虑在 QEMU 的系统模拟模式下运行整个 guest 操作系统,然后在 guest 程序上运行 Arm Valgrind。

关于c++ - Valgrind 和 QEMU - 无法检测内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55161252/

相关文章:

C++模板自动参数

c++ - return 语句何时需要显式 move ?

memory - NASM 内存未被正确访问?

python - 强制丢弃 Python Imaging Library 图像以回收内存

mysql - 有关如何优化此 SQL 查询的想法

c++ - 在实现类中访问类的方法

c++ - 如何从嵌套的 lambda 表达式创建 Functor 类

linux - alsa - 内存泄漏?

c++ - 返回字符串的静态方法

c++ - 为什么这个Deque析构函数有内存泄漏