Как вы говорите Valgrind полностью подавить определенный файл.so?
Я пытаюсь использовать Valgrind в программе, над которой я работаю, но Valgrind генерирует кучу ошибок для одной из библиотек, которые я использую. Я хотел бы быть в состоянии сказать это, чтобы подавить все ошибки, которые связаны с этой библиотекой. Самое близкое правило, которое я могу придумать для файла подавления:
{
rule name
Memcheck:Cond
...
obj:/path/to/library/thelibrary.so
}
Это не совсем делает работу, однако. Я должен создать один из них для каждого типа подавления (Cond, Value4, Param и т. Д.), И, кажется, все еще пропущены некоторые ошибки, которые имеют библиотеку в трассировке стека.
Есть ли способ дать Valgrind единственное правило подавления, чтобы оно полностью игнорировало определенную библиотеку? И даже если нет способа создать такое правило, которое охватывает все типы подавления, существует ли хотя бы способ создать правило, которое игнорирует все ошибки определенного типа подавления из определенной библиотеки?
3 ответа
Для большинства типов подавления вы пропускаете подстановочный знак, например так:
{
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
...
}
Похоже, что необходимо включать отдельную запись подавления для каждого типа ошибки (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>
это заполнитель, в котором вы можете ввести любой описательный текст, который вы хотите. Требуется не быть пустым.
Ответ nobar почти сработал для меня, но я получил синтаксическую ошибку:
==15566== FATAL: in suppressions file "suppresion.error.txt" near line 4:
==15566== bad or missing extra suppression info
==15566== exiting now.
Для системных вызовов мне нужно было добавить дополнительную строку в качестве состояния документов:
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
...
}