0

我想用 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 用户模式相结合的内存泄漏?

提前致谢

4

1 回答 1

1

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

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

于 2019-03-14T11:44:06.877 回答