20

我按照这种方法在 iOS 应用程序上运行 Valgrind。不幸的是,与 iOS SDK 有关的警告几乎不可能找到与我的应用程序相关的任何警告。是否有针对 Valgrind 的 iOS 抑制列表,所以我不必自己生成它们?

4

1 回答 1

3

看起来您可能可以修改您的代码,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。

于 2012-07-17T14:35:29.070 回答