valgrind报告错误本身?

时间:2013-10-22 17:41:02

标签: valgrind

我正在通过valgrind运行我的程序,但它似乎产生了由工具本身引起的错误?我的所有错误都如下所示,但是通过阅读其他帖子,似乎通常at行告诉您程序中出现的违规malloc,但我所有at行都来自valgrind 。我的计划中存在这些合法错误吗?

==10551== 32,808 (24 direct, 32,784 indirect) bytes in 1 blocks are definitely lost in loss     record 840 of 843
==10551==    at 0x54D7: malloc_zone_malloc (in     /usr/local/Cellar/valgrind/3.8.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==10551==    by 0x7C5171: NXCreateMapTableFromZone (in /usr/lib/libobjc.A.dylib)
==10551==    by 0x7C4722: _read_images (in /usr/lib/libobjc.A.dylib)
==10551==    by 0x7C39EB: map_images_nolock (in /usr/lib/libobjc.A.dylib)
==10551==    by 0x7C34F3: map_images (in /usr/lib/libobjc.A.dylib)
==10551==    by 0x7FFF5FC04936: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*)) (in /usr/lib/dyld)
==10551==    by 0x7FFF5FC0467C: dyld::registerImageStateBatchChangeHandler(dyld_image_states, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*)) (in /usr/lib/dyld)
==10551==    by 0xA99ED9: dyld_register_image_state_change_handler (in /usr/lib/system/libdyld.dylib)
==10551==    by 0x7C204C: _objc_init (in /usr/lib/libobjc.A.dylib)
==10551==    by 0x6BB27: libSystem_initializer (in /usr/lib/libSystem.B.dylib)
==10551==    by 0x7FFF5FC13377: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==10551==    by 0x7FFF5FC13761: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==10551== 

我用homebrew安装valgrind。它可能与此错误有关:

==10551== WARNING: Support on MacOS 10.8 is experimental and mostly broken.
==10551== WARNING: Expect incorrect results, assertions and crashes.

但我只是想确保(之前使用过这个的人)这些错误不是来自我的程序。 (我在10.8)。

2 个答案:

答案 0 :(得分:0)

Valgrind取代了库函数的默认实现,分配和释放内存(malloc(),calloc(),realloc(),free()是最重要的),由它自己来跟踪对它们的调用并进行簿记。 。回溯显示调用堆栈到malloc()调用,该调用分配了永远不会释放的内存()。所以问题不在于malloc()本身 - 而是在调用malloc()的代码中没有相应的free()。

答案 1 :(得分:0)

错误检查工具可以检测系统库中的许多问题,例如C库,它是随操作系统预安装的。您无法轻松修复这些错误,但您不希望看到这些错误(是的,有很多错误!)因此,Valgrind会在启动时读取要抑制的错误列表。构建系统时,。/ configure脚本会创建默认抑制文件。

您可以随意修改并添加到抑制文件,或者更好地编写自己的文件。允许多个抑制文件。如果您的项目的一部分包含您不能或不想修复的错误,这很有用,但您不希望不断地提醒它们。

注意:到目前为止,添加抑制的最简单方法是使用Core命令行选项中描述的--gen-suppressions = yes选项。这会自动生成抑制。但是,为了获得最佳效果,您可能需要手动编辑--gen-suppressions = yes的输出,在这种情况下,建议您仔细阅读本节。

非常具体地描述了要抑制的每个错误,以最小化抑制指令无意中抑制了您想要看到的一堆类似错误的可能性。抑制机制旨在允许精确而灵活的错误指定来抑制。