根据 valgrind 文档:
位置可以是共享对象、函数或源代码行的名称。它们分别以 obj:、fun: 或 src: 开头。要匹配的函数、对象和文件名可以使用通配符 * 和 ?。源行使用 filename[:lineNumber] 形式指定。
所以
?
算作通配符,但是,要匹配什么?我有这样的堆栈框架:
==60548== Invalid write of size 4
==60548== by 0x....: ???
==60548== by 0x....: ???
==60548== by 0x....: function_signature_2 (in /some/path/libX.so)
==60548== by 0x....: function_signature_3 (in /some/path/libX.so)
==60548== by 0x....: function_signature_4 (some_file2:some_line2)
例如,我想过滤那些在堆栈顶部具有 ???
的内容。我可以编写自定义抑制:
{
mysuppression
Memcheck:Addr4
obj:???
}
而且看起来效果不错,但是?
到底是做什么用的呢?匹配一个单个字符(因此
obj:???
匹配名称为 3 个字符长的所有对象?),还是将前一个字符标记为可选出现? (在这种情况下,第一个字符
?
是什么意思?),或任何其他类似的含义?
*
匹配任意数量的任意字符。
?
匹配任意字符一次。在日志文件中,
???
表示未找到函数名称。它在匹配方面没有像抑制语法那样的任何意义。