Могу ли я сделать 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 во время сборки.