Могу ли я заставить valgrind игнорировать библиотеки glibc? - PullRequest
11 голосов
/ 24 мая 2010

Можно ли сказать, что valgrind игнорирует некоторый набор библиотек? В частности библиотеки glibc ..

Актуальная проблема: У меня есть код, который отлично работает в обычном исполнении. Нет утечек и т. Д.

Когда я пытаюсь запустить его через valgrind, я получаю дампы ядра и перезапуск / остановку программы.

Core обычно указывает на функции glibc (обычно fseek, mutex и т. Д.). Я понимаю, что могут быть проблемы с несовместимой версией glibc / valgrind.

Я пробовал разные выпуски valgrind и glibc, но не повезло. Какие-либо предложения?

Ответы [ 4 ]

10 голосов
/ 21 марта 2013

Это, вероятно, не ответит на ваш вопрос, но предоставит вам особенности того, как подавить определенные ошибки (на которые ссылались другие, но не описали подробно):

Сначала запустите valgrind следующим образом:

 valgrind --gen-suppressions=all --log-file=valgrind.out ./a.out

Теперь выходной файл valgrind.out будет содержать несколько автоматически сгенерированных блоков подавления, таких как:

{
   stupid sendmsg bug: http://sourceware.org/bugzilla/show_bug.cgi?id=14687
   Memcheck:Param
   sendmsg(mmsg[0].msg_hdr)
   fun:sendmmsg
   obj:/usr/lib/libresolv-2.17.so
   fun:__libc_res_nquery
   obj:/usr/lib/libresolv-2.17.so
   fun:__libc_res_nsearch
   fun:_nss_dns_gethostbyname4_r
   fun:gaih_inet
   fun:getaddrinfo
   fun:get_socket_fd
   fun:main
}

Где «глупая ошибка sendmsg» и ссылка - это имя, которое я добавил для ссылки на этот блок. Теперь сохраните этот блок в sendmsg.supp и сообщите valgrind об этом файле при следующем запуске:

valgrind --log-file=valgrind --suppressions=sendmsg.supp ./a.out

И valgrind будет любезно игнорировать эту глупую ошибку в верхнем потоке.

4 голосов
/ 25 мая 2010

Как отмечает unwind, у valgrind есть тщательно продуманный механизм для контроля того, какие процедуры и как используются. Но и valgrind, и glibc - сложные звери, и вы действительно, действительно, действительно не хотите этого делать. Самый простой способ получить glibc и valgrind, которые являются взаимно совместимыми, - это получить оба из дистрибутива Linux на ваш выбор . Вещи должны «просто работать», а если нет, у вас есть к кому обратиться.

3 голосов
/ 24 мая 2010

Да, посмотрите на систему подавления от Valgrind .

1 голос
/ 24 мая 2010

Возможно, вы захотите спросить об этом в Списке рассылки пользователя Valgrind (что очень полезно). Вы можете подавить вывод от определенных вызовов, однако подавление шума - это все, что вы делаете. Звонки все еще проходят через Valgrind.

Чтобы выполнить то, что вам нужно, вы (в идеале) сопоставляете Valgrind соответствующим образом с glibc или , используя макросы в valgrind/valgrind.h, чтобы обойти их. Используя их, да, вы можете сказать Valgrind не трогать определенные вещи. Я не уверен, какие вызовы прерывают все, но вы также можете (выборочно) не запускать биты кода в вашей собственной программе, если она выполняется в valgrind. Смотрите макрос RUNNING_ON_VALGRIND в valgrind/valgrind.h.

Еще одна вещь, которая приходит на ум, - убедиться, что Valgrind был правильно скомпилирован для работы с потоками . Имейте в виду, что атомарные операции в Valgrind могут привести к сбою вашей программы во время гоночных операций, в противном случае это может произойти, если не настроено должным образом.

Если вы меняли версии valgrind и glibc, есть вероятность, что вы нашли совпадение, но неправильно настроили valgrind во время сборки.

...