我按照这种方法在 iOS 应用程序上运行 Valgrind。不幸的是,与 iOS SDK 有关的警告几乎不可能找到与我的应用程序相关的任何警告。是否有针对 Valgrind 的 iOS 抑制列表,所以我不必自己生成它们?
1 回答
看起来您可能可以修改您的代码,main()
以便它将正确的选项传递给 Valgrind。(请注意,这假设您正在运行 memcheck,这是默认选项,并且您似乎正在从您的 pastebin 运行)。
Valgrind/Memcheck 预计会报告您已有的库的错误,包括 Obj-C/iOS SDK。要禁止 Memcheck 报告错误,请使用以下命令:
这会自动生成抑制:--gen-suppressions=yes
您还可以/可能想要更深入地了解您不想看到的内容:
添加要考虑的抑制文件:
--suppressions=/path/to/file.supp.
抑制类型(第二)行应具有以下形式:
Memcheck:suppression_type
Memcheck 抑制类型如下:
Value1, Value2, Value4, Value8, Value16
,表示使用 1、2、4、8 或 16 字节的值时出现未初始化值错误。
Cond (or its old name, Value0)
,表示使用未初始化的 CPU 条件代码。
Addr1, Addr2, Addr4, Addr8, Addr16
,表示分别在 1、2、4、8 或 16 个字节的内存访问期间的无效地址。
Jump
,表示跳转到无法寻址的位置错误。
Param
,表示无效的系统调用参数错误。
Free
,表示无效或不匹配的免费。
Overlap
, 表示 memcpy 或类似函数中的 src / dst 重叠。
Leak
,表示内存泄漏。
还要检查Valgrind 文档中的抑制错误以获取更多信息。请注意,您可以拥有多个抑制文件,因此我只会编写您自己的文件,您以后可以随时删除。
但是,您可能想查看出现这些错误的原因。看起来它们中的很多都是 SDK,您可能想忽略它们 - 但可能在打开轨道来源(您已经完成)并检查您自己的代码以防万一之后。
未初始化值错误是您被警告未初始化值的地方(duh) - 但是,它仅在您有一个将产生影响的未初始化值时才会这样做,因为未初始化值还有其他用途。
通常,这些是允许传播的,直到您在“不应该”的地方使用它们。然后,只要您实际尝试使用它们,它就会报告这些值。
您已经知道可以打开--track-origins=<yes|no>
(默认为 no)以找出它们来自哪里,并且看起来它们确实来自 SDK。对于那些不知道的人来说,--track-origins
这真的很有帮助,因为当它关闭时,您只知道未初始化的值正在以“危险”的方式使用,但您不知道未初始化的值来自哪里。
请记住,如果--undef-value-errors=no
也在使用 Memcheck 将拒绝将此设置为 yes。