我跟着this approach在iOS应用上运行Valgrind。不幸的是,有关iOS SDK的警告几乎不可能找到与我的应用程序相关的任何警告。是否有Valgrind的iOS抑制列表,所以我不必自己生成它们?
答案 0 :(得分: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
,意思是内存泄漏。
另请查看suppressing errors in the Valgrind docs了解详情。 请注意,您可以拥有多个抑制文件,因此我只需编写您自己的文件,以后可以随时删除。
但是,您可能希望查看为什么出现这些错误。看起来很多都是SDK,你可能想要忽略它们 - 但可能在打开轨道起点(你已经完成)并检查你自己的代码以防万一。
未初始化的值错误是您被警告未初始化值(duh)的地方 - 但是,只有当您有一个未初始化的值会产生影响时,它才会执行此操作,因为还有其他未初始化值的使用。 / p>
通常,允许这些传播,直到你“不应该”使用它们为止。然后,只要您真正尝试使用它们,它就会报告这些值。
您已经知道可以打开--track-origins=<yes|no>
(默认为no)以查找它们的来源,看起来它们来自SDK。对于那些不知道的人来说,--track-origins
确实非常有用,因为当它关闭时,你只会知道未初始化的值正以“危险”的方式使用,但你不知道未初始化的值来自何处从。
请记住,如果--undef-value-errors=no
也被使用,Memcheck会拒绝将此设置为是。