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

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

3 ответа

Решение

Вы можете генерировать подавления для ошибок для библиотек, но я не думаю, что вы можете вообще исключить библиотеки.

Также трудно автоматически определить, вызвана ли ошибка памяти в библиотеке проблемой в вашем коде или нет.

Предполагая, что у вас запущен инструмент memcheck, и вы хотите игнорировать ошибки Leak только в 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.*
}

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

К вашему сведению: я использую valgrind 3.5.

В частности, с OpenSSL это очень сложно. Ключи шифрования SSL частично основаны на мусоре неинициализированного стека, что означает, что все дешифрованные данные также заражены. Это загрязнение имеет тенденцию распространяться за пределы самого OpenSSL.

Компиляция OpenSSL с опцией "PURIFY" может помочь здесь. К сожалению, из-за некоторых плохо продуманных действий крупного дистрибутива Linux это вряд ли станет дефолтом.

Очень тупым обходным путем является memcheck's --undef-value-errors=no вариант.

Другие вопросы по тегам