Или, возможно, все они вместо моего кода? Моя программа использует Gtk, Loudmouth и несколько других вещей, и эти два (и некоторые из них, libgcrypto, libssl) вызывают так много ошибок, что я не могу обнаружить свои собственные. Можно ли заставить valgrind игнорировать вещи, поступающие из более глубокого, чем мой собственный код?
Можно ли заставить valgrind игнорировать некоторые библиотеки?
Ответ 1
Вы можете создавать исключения для ошибок для библиотек, но я не думаю, что вы можете вообще исключить библиотеки.
Также трудно автоматически узнать, вызвана ли ошибка памяти в библиотеке проблемой в вашем коде или нет.
Ответ 2
Предполагая, что вы запускаете средство memcheck, и вы хотите игнорировать ошибки утечки в только libcrypto, вы можете поставить подавление как:
{
ignore_libcrypto_conditional_jump_errors
Memcheck:Leak
...
obj:*/libcrypto.so.*
}
... в файл и передать его valgrind
с помощью --suppressions=*FILENAME*
.
Чтобы игнорировать ошибки утечки в всех разделяемых библиотеках в любом каталоге lib (/lib,/lib64,/usr/lib,/usr/lib64,...):
{
ignore_unversioned_libs
Memcheck:Leak
...
obj:*/lib*/lib*.so
}
{
ignore_versioned_libs
Memcheck:Leak
...
obj:*/lib*/lib*.so.*
}
Это маловероятно, но вам может потребоваться добавить дополнительные вариации шаблона каталога для учета местоположений библиотек X11 и GTK.
Помните, что это будет игнорировать ошибки, вызванные любыми обратными вызовами, которые вы написали, которые были вызваны библиотеками. Ловить ошибки в этих обратных вызовах можно было почти с помощью:
{
ignore_unversioned_libs
Memcheck:Leak
obj:*/lib*/lib*.so
...
obj:*/lib*/lib*.so
}
{
ignore_versioned_libs
Memcheck:Leak
obj:*/lib*/lib*.so.*
...
obj:*/lib*/lib*.so.*
}
... но это показывает ошибки в вызовах библиотекой, использующей Valgrind malloc. Поскольку valgrind malloc вводится непосредственно в текст программы - не загружается как динамическая библиотека - он отображается в стеке так же, как и ваш собственный код. Это позволяет Valgrind отслеживать распределения, но также затрудняет выполнение именно того, что вы просили.
FYI: Я использую valgrind 3.5.
Ответ 3
В OpenSSL, в частности, это очень сложно. Ключи шифрования SSL частично основаны на неинициализированном мусоре стека, что означает, что все дешифрованные данные также загрязнены. Это загрязнение имеет тенденцию распространяться за пределы самого OpenSSL.
Компиляция OpenSSL с опцией "PURIFY" может помочь здесь. К сожалению, из-за некоторых слабо продуманных действий основного дистрибутива Linux это вряд ли станет стандартным.
Очень тупой обходной путь - это memcheck --undef-value-errors=no
.