Можно ли заставить valgrind игнорировать определенные библиотеки? - PullRequest
49 голосов
/ 04 июля 2010

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

Ответы [ 3 ]

37 голосов
/ 08 февраля 2013

Если вы используете инструмент 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.

10 голосов
/ 04 июля 2010

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

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

6 голосов
/ 04 июля 2010

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

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

Очень тупой обходной путь - опция memcheck --undef-value-errors=no.

...