【发布时间】:2017-07-23 21:33:13
【问题描述】:
我尝试在非常简单的项目中运行 valgrind 3.13 和 3.14(在 macOS 10.12.6 上),但我遇到了以前在我的 linux 中从未遇到过的奇怪错误。
-
非常简单的C程序
main.c:int main() { return (0); } -
用
cc编译:$> cc main.c -
用
valgrind运行我的简单程序:$> valgrind ./a.out -
valgrind 的输出:
==12768== Memcheck, a memory error detector ==12768== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. ==12768== Using Valgrind-3.14.0.SVN and LibVEX; rerun with -h for copyright info ==12768== Command: ./a.out ==12768== ==12768== Syscall param msg->desc.port.name points to uninitialised byte(s) ==12768== at 0x10049434A: mach_msg_trap (in /usr/lib/system/libsystem_kernel.dylib) ==12768== by 0x100493796: mach_msg (in /usr/lib/system/libsystem_kernel.dylib) ==12768== by 0x10048D485: task_set_special_port (in /usr/lib/system/libsystem_kernel.dylib) ==12768== by 0x10062910E: _os_trace_create_debug_control_port (in /usr/lib/system/libsystem_trace.dylib) ==12768== by 0x100629458: _libtrace_init (in /usr/lib/system/libsystem_trace.dylib) ==12768== by 0x1001599DF: libSystem_initializer (in /usr/lib/libSystem.B.dylib) ==12768== by 0x100017A1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) ==12768== by 0x100017C1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) ==12768== by 0x1000134A9: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, char const*, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) (in /usr/lib/dyld) ==12768== by 0x100013440: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, char const*, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) (in /usr/lib/dyld) ==12768== by 0x100012523: ImageLoader::processInitializers(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) (in /usr/lib/dyld) ==12768== by 0x1000125B8: ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld) ==12768== Address 0x10488ac6c is on thread 1's stack ==12768== in frame #2, created by task_set_special_port (???:) ==12768== Uninitialised value was created by a stack allocation ==12768== at 0x1006290A6: _os_trace_create_debug_control_port (in /usr/lib/system/libsystem_trace.dylib) ==12768== ==12768== ==12768== HEAP SUMMARY: ==12768== in use at exit: 18,144 bytes in 162 blocks ==12768== total heap usage: 178 allocs, 16 frees, 24,288 bytes allocated ==12768== ==12768== LEAK SUMMARY: ==12768== definitely lost: 3,456 bytes in 54 blocks ==12768== indirectly lost: 0 bytes in 0 blocks ==12768== possibly lost: 72 bytes in 3 blocks ==12768== still reachable: 200 bytes in 6 blocks ==12768== suppressed: 14,416 bytes in 99 blocks ==12768== Rerun with --leak-check=full to see details of leaked memory ==12768== ==12768== For counts of detected and suppressed errors, rerun with: -v ==12768== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 4 from 4)这部分trace我没看懂:
==12768== Syscall param msg->desc.port.name points to uninitialised byte(s) ==12768== at 0x10049434A: mach_msg_trap (in /usr/lib/system/libsystem_kernel.dylib) ==12768== by 0x100493796: mach_msg (in /usr/lib/system/libsystem_kernel.dylib) ==12768== by 0x10048D485: task_set_special_port (in /usr/lib/system/libsystem_kernel.dylib) ==12768== by 0x10062910E: _os_trace_create_debug_control_port (in /usr/lib/system/libsystem_trace.dylib) ==12768== by 0x100629458: _libtrace_init (in /usr/lib/system/libsystem_trace.dylib) ==12768== by 0x1001599DF: libSystem_initializer (in /usr/lib/libSystem.B.dylib) ==12768== by 0x100017A1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) ==12768== by 0x100017C1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) ==12768== by 0x1000134A9: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, char const*, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) (in /usr/lib/dyld) ==12768== by 0x100013440: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, char const*, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) (in /usr/lib/dyld) ==12768== by 0x100012523: ImageLoader::processInitializers(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) (in /usr/lib/dyld) ==12768== by 0x1000125B8: ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld) ==12768== Address 0x10488ac6c is on thread 1's stack ==12768== in frame #2, created by task_set_special_port (???:) ==12768== Uninitialised value was created by a stack allocation ==12768== at 0x1006290A6: _os_trace_create_debug_control_port (in /usr/lib/system/libsystem_trace.dylib)
我不明白为什么我的简单 return(0) 的堆摘要如此之大(178 分配,16 释放,24,288 字节分配);程序。
【问题讨论】:
-
我有同样的问题(在相同版本的 macOS 10.12.6 上);如果您包含
--leak-check=full,它会返回更多消息 -
我也有同样的问题。
-
我在 Mac OS X 10.12 上遇到了同样的错误。我想可能有补丁吗?见this bug