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

时间:2019-03-14 11:22:42

标签: 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用户模式结合使用时不会发现内存泄漏吗?

预先感谢

1 个答案:

答案 0 :(得分:0)

您正在QEMU本身上运行Valgrind,这将导致valgrind报告QEMU自己的代码中的内存泄漏,但是valgrind对在QEMU下运行的来宾程序所做的操作是否具有足够的可见性以能够报告来宾中的泄漏。特别是,Valgrind的工作原理是拦截对malloc,free,operator new等的调用-它将针对主机QEMU进程的(x86)分配和空闲调用执行此操作,但无法拦截对来宾的(arm)调用过程制造。

您可能会考虑在QEMU的系统仿真模式下运行整个来宾OS,然后在来宾程序中的其中运行Arm Valgrind。