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

Как вы сообщаете Valgrind полностью подавить файл .so?

Я пытаюсь использовать Valgrind в программе, над которой я работаю, но Valgrind генерирует кучу ошибок для одной из библиотек, которые я использую. Я бы хотел сказать, чтобы он подавлял все ошибки, связанные с этой библиотекой. Самое близкое правило, которое я могу придумать для файла подавления, -

{
   rule name
   Memcheck:Cond
   ...
   obj:/path/to/library/thelibrary.so
}

Однако это не полностью выполняет эту работу. Я должен создать один из них для каждого типа подавления, который появляется (Cond, Value4, Param и т.д.), И, похоже, он все еще пропускает некоторые ошибки, которые имеют библиотеку в трассировке стека.

Есть ли способ дать Valgrind одно правило подавления, чтобы полностью игнорировать определенную библиотеку? И даже если нет способа сделать такое правило, которое охватывает все типы подавления, существует ли хотя бы способ создания правила, которое игнорирует все ошибки конкретного типа подавления из конкретной библиотеки?

4b9b3361

Ответ 1

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

{
   name
   Memcheck:Cond
   obj:/path/to/lib/lib.so.10.1
}

{
   name
   Memcheck:Free
   obj:/path/to/lib/lib.so.10.1
}

{
   name
   Memcheck:Value8
   obj:/path/to/lib/lib.so.10.1
}

Обратите внимание, что вы должны указывать каждый тип ошибки отдельно, вы не можете подставлять их подстановочные знаки. Вы также должны указать весь путь к библиотеке (как показано valgrind, с любыми "украшениями", такими как номера версий).

Кроме того, утечки обрабатываются по-разному - для тех, кому нужно что-то похожее на это:

{
   name
   Memcheck:Leak
   fun:*alloc
   ...
   obj:/path/to/lib/lib.so.10.1
   ...
}

Ответ 2

Похоже, что для каждого типа ошибки необходимо включить отдельную запись подавления (Cond, Value4, Param и т.д.). Но, основываясь на моем тестировании с valgrind-3.6.0.SVN-Debian, я считаю, что вы можете использовать следующую упрощенную форму для каждого типа ошибок...

{
   <insert_a_suppression_name_here>
   Memcheck:Cond
   ...
   obj:/path/to/library/thelibrary.so.*
   ...
}

{
   <insert_a_suppression_name_here>
   Memcheck:Leak
   ...
   obj:/path/to/library/thelibrary.so.*
   ...
}

Эти три точки называются подстановочными знаками уровня кадра в документах Valgrind. Они соответствуют нулю или более кадрам в стеке вызовов. Другими словами, вы используете их, когда не имеет значения, кто звонил в библиотеку или какие функции библиотеки впоследствии вызывает.

Иногда ошибки включают в себя "obj:" фреймы, а иногда они используют только фреймы "fun:". В целом это основано на том, включена ли эта функция в таблицу символов библиотеки. Если цель состоит в том, чтобы исключить всю библиотеку, , она может работать лучше всего, если библиотека не включает символы, поэтому вы можете исключить на основе имени файла библиотеки вместо того, чтобы создавать отдельные запреты для каждого вызова функции внутри библиотека. Надеюсь, Valgrind достаточно умен, чтобы подавлять ошибки на основе имени файла библиотеки, даже когда он знает имя функции, но я этого не подтвердил.

Если вам нужно добавить подавления на основе отдельных функций в библиотеке, вы должны иметь возможность использовать ту же форму...

{
   <insert_a_suppression_name_here>
   Memcheck:Leak
   ...
   fun:the_name_of_the_function
   ...
}

Примечание. Вы можете включить --gen-suppressions=all в командной строке valgrind, чтобы увидеть точную форму и имена (включая любое С++), требуемое для подавления каждой ошибки. Вы можете использовать этот вывод в качестве шаблона для своих записей подавления - в котором вы обычно хотите заменить большинство строк на ..., чтобы упростить процесс подавления всех ошибок, которые могут возникнуть в связи с определенной библиотекой или вызовом функции.

Примечание. <insert_a_suppression_name_here> - это заполнитель, в который вы можете ввести любой дескриптивный текст, который вы хотите. Это не должно быть пустым.

Ответ 3

nobar answer почти работал у меня, но я получал синтаксическую ошибку:

==15566== FATAL: in suppressions file "suppresion.error.txt" near line 4:
==15566==    bad or missing extra suppression info
==15566== exiting now.

Для системных вызовов мне нужно было добавить дополнительную строку в качестве docs состояние:

Param errors have a mandatory extra information line at this point,
which is the name of the offending system call parameter.

Итак, я закончил с этим, и он сработал:

{
   <sup_mmap_length>
   Memcheck:Param
   mmap(length)
   ...
   fun:function_from_offending_lib
   ...
}