Как вы говорите Valgrind полностью подавить определенный файл .so? - PullRequest
31 голосов
/ 04 марта 2010

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

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

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

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

Ответы [ 3 ]

30 голосов
/ 19 ноября 2010

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

{
   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
   ...
}
17 голосов
/ 20 декабря 2011

По-видимому, необходимо включать отдельную запись подавления для каждого типа ошибки (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, чтобы увидеть точную форму и имена (включая любые искажения в C ++), необходимые для подавления каждой ошибки. Вы можете использовать этот вывод в качестве шаблона для ваших записей подавления - в котором вы обычно хотите заменить большинство строк на ..., чтобы упростить процесс подавления всех ошибок, которые могут возникнуть в связи с конкретной библиотекой или вызовом функции .

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

2 голосов
/ 20 октября 2017

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

==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
   ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...