我想用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)分配和免费调用执行此操作,但无法拦截(arm)调用您的guest虚拟机过程使。
您可能会看到在QEMU的系统仿真模式下运行整个客户操作系统,然后在您的客户程序中运行Arm Valgrind。