Могу ли я сделать valgrind игнорировать библиотеки glibc?

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

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

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

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

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

Ответ 1

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

Сначала запустите 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 будет любезно игнорировать эту тупую ошибку восходящего потока.

Ответ 2

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

Ответ 3

Да, посмотрите на систему Valgrind .

Ответ 4

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

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

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

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