Подтвердить что ты не робот

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

Или, возможно, все они вместо моего кода? Моя программа использует Gtk, Loudmouth и несколько других вещей, и эти два (и некоторые из них, libgcrypto, libssl) вызывают так много ошибок, что я не могу обнаружить свои собственные. Можно ли заставить valgrind игнорировать вещи, поступающие из более глубокого, чем мой собственный код?

4b9b3361

Ответ 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.