Valgrind macOs和错误Syscall param msg-> desc.port.name指向未初始化的字节

Sac*_*rah 12 c macos valgrind cc

我尝试在非常简单的项目中运行valgrind 3.13和3.14(在macOs 10.12.6上),但我得到了一个奇怪的错误,我以前从未在linux中获得过.

  1. 非常简单的C程序main.c:

    int main() {
        return (0);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 编译cc:

    $> cc main.c
    
    Run Code Online (Sandbox Code Playgroud)
  3. 运行我的简单程序valgrind:

    $> valgrind ./a.out
    
    Run Code Online (Sandbox Code Playgroud)
  4. 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)
    
    Run Code Online (Sandbox Code Playgroud)

    我不明白这一部分的痕迹:

    ==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)
    
    Run Code Online (Sandbox Code Playgroud)

我不明白为什么堆简要是如此之大(178个分配,16个释放,分配24,288个字节)我的简单返回(0); 程序.

小智 1

我刚刚检查了这里的错误状态,它似乎已解决,所以我只是检查了相应的提交并编译。它解决了未初始化字节的问题,但接缝会产生新问题:未处理的 MACH_SEND_TRAILER ?

1)克隆master分支

$ git clone git://sourceware.org/git/valgrind.git
Run Code Online (Sandbox Code Playgroud)

2)用修复补丁它:

$ cd valgrind

$ git checkout 128fd6e
Run Code Online (Sandbox Code Playgroud)

3)照常配置编译和安装,说明在这里

4)用一个简单的程序测试一下

$ cd <install-folder>/bin
$ ./valgrind ls -l

==19116== Memcheck, a memory error detector
==19116== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
    ==19116== Using Valgrind-3.14.0.GIT and LibVEX; rerun with -h for copyright info
==19116== Command: ls -l
==19116== 
--19116-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option
--19116-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option (repeated 2 times)
--19116-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option (repeated 4 times)
--19116-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option (repeated 8 times)
total 552
-rwxr-xr-x  1 user  student  41642 Sep 11 15:55 callgrind_annotate
-rwxr-xr-x  1 user  student  12020 Sep 11 15:55 callgrind_control
-rwxr-xr-x  1 user  student  32174 Sep 11 15:55 cg_annotate
-rwxr-xr-x  1 user  student  10422 Sep 11 15:55 cg_diff
-rwxr-xr-x  1 user  student  29964 Sep 11 15:55 cg_merge
-rwxr-xr-x  1 user  student  24402 Sep 11 15:55 ms_print
-rwxr-xr-x  1 user  student  24468 Sep 11 15:55 valgrind
-rwxr-xr-x  1 user  student  39048 Sep 11 15:55 valgrind-di-server
-rwxr-xr-x  1 user  student  15056 Sep 11 15:55 valgrind-listener
-rwxr-xr-x  1 user  student  40216 Sep 11 15:55 vgdb
==19116== 
==19116== HEAP SUMMARY:
==19116==     in use at exit: 136,779 bytes in 225 blocks
==19116==   total heap usage: 420 allocs, 195 frees, 202,112 bytes allocated
==19116== 
==19116== LEAK SUMMARY:
==19116==    definitely lost: 0 bytes in 0 blocks
==19116==    indirectly lost: 0 bytes in 0 blocks
==19116==      possibly lost: 72 bytes in 3 blocks
==19116==    still reachable: 114,861 bytes in 71 blocks
==19116==         suppressed: 21,846 bytes in 151 blocks
==19116== Rerun with --leak-check=full to see details of leaked memory
==19116== 
==19116== For counts of detected and suppressed errors, rerun with: -v
==19116== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 4)
Run Code Online (Sandbox Code Playgroud)

在 linux ubuntu 16.04 上使用 valgrind 3.11.0 进行的相同测试提供了干净的输出。