Valgrind и QEMU - невозможно обнаружить утечку памяти - PullRequest
0 голосов
/ 14 марта 2019

Я хочу проверить свой код C ++ на утечки памяти с помощью Valgrind (memcheck) x86.

Но программное обеспечение кросс-компилируется и работает на ARM.

Чтобы провести некоторое автоматическое тестирование, я решил эмулировать свое оборудование ARM через QEMU.

И я также решил использовать бинарные файлы ARM для модульного теста cpputest , чтобы обеспечить детерминистическое поведение и поиск утечек памяти в объеме, охватываемом модульным тестом.

В общем, у меня есть двоичный файл ARM, который должен эмулироваться через пользовательский режим QEMU.

Мой звонок выглядит так:

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

Мой код на C ++ выглядит так. Утечка памяти составляет 20 байт, и вызов valgrind не находит эту утечку при использовании ее с QEMU. После того, как я вставил выделение памяти и не использовал механизм освобождения, я ожидал утечку памяти

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 находит утечку с точно таким же двоичным файлом.

Кто-нибудь из вас имеет представление, почему Valgrind не обнаруживает утечку памяти в сочетании с пользовательским режимом QEMU?

Заранее спасибо

1 Ответ

0 голосов
/ 14 марта 2019

Вы запускаете Valgrind на самом QEMU, что заставит valgrind сообщать об утечках памяти в собственном коде QEMU, но valgrind не имеет достаточного представления о том, что делает гостевая программа, работающая под QEMU, чтобы сообщать об утечках в гостевой системе. , В частности, Valgrind работает, перехватывая вызовы malloc, free, operator new и т. Д. - он будет делать это для распределения (x86) процесса хоста QEMU и бесплатных вызовов, но не имеет возможности перехватывать вызовы (arm) вашего гостя. процесс делает.

Вы можете посмотреть на запуск всей гостевой ОС в режиме эмуляции системы QEMU, а затем запустить Arm Valgrind в вашей гостевой программе.

...