#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 вместо этого.