Valgrind и QEMU — не удалось обнаружить утечку памяти

#c #memory #valgrind #qemu #cpputest

#c #память #valgrind #qemu #cpputest

Вопрос:

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

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

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

Ответ №1:

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

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

Комментарии:

1. Спасибо за ваше хорошее объяснение. Я рассмотрю возможность использования системы QEMU вместо этого.