Valgrind macO和错误的系统调用参数msg-> desc.port.name指向未初始化的字节 [英] Valgrind macOs and error Syscall param msg->desc.port.name points to uninitialised byte(s)

查看:113
本文介绍了Valgrind macO和错误的系统调用参数msg-> desc.port.name指向未初始化的字节的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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


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

      int main(){
    返回(0);
    }


  2. 使用 cc

      $> cc main.c 


  3. 使用 valgrind运行我的简单程序

      $> valgrind ./a.out 


  4. valgrind的输出:

      == 12768 == Memcheck,内存错误检测器
    == 12768 ==版权所有(C)2002-2017和GNU GPL,由朱利安·塞沃德(Julian Seward)等人撰写。
    == 12768 ==使用Valgrind-3.14.0.SVN和LibVEX;用-h重新运行以获取版权信息
    == 12768 ==命令:./ a.out
    == 12768 ==
    == 12768 ==系统调用参数msg-> desc.port .name指向未初始化的字节
    == 12768 ==在0x10049434A:mach_msg_trap(在/usr/lib/system/libsystem_kernel.dylib中)
    == 12768 ==通过0x100493796:mach_msg(在/usr/lib/system/libsystem_kernel.dylib)
    == 12768 ==通过0x10048D485:task_set_special_port(在/usr/lib/system/libsystem_kernel.dylib中)
    == 12768 ==通过0x10062910E:_os_trace_create_debug_control_port (在/usr/lib/system/libsystem_trace.dylib中)
    == 12768 ==通过0x100629458:_libtrace_init(在/usr/lib/system/libsystem_trace.dylib中)
    == 12768 ==通过0x1001599DF :libSystem_initializer(在/usr/lib/libSystem.B.dylib中)
    == 12768 ==由0x100017A1A:ImageLoaderMachO :: doModInitFunctions(ImageLoader :: LinkContext const&)(在/ usr / lib / dyld中)
    == 12768 ==通过0x100017C1D:ImageLoaderMachO :: doInitialization(ImageLoader :: LinkContext const&)(在/ usr / lib / dyld中)
    == 12768 ==通过0x1000134A9:ImageLoader :: recursiveInitialization(ImageLoader :: LinkContext const& ;, unsigned int,char const *,ImageLoader :: InitializerTimingList& ;, ImageLoader :: UninitedUpwards&)(在/ usr / lib / dyld中)
    = = 12768 ==通过0x100013440:ImageLoader :: recursiveInitialization(ImageLoader :: LinkContext const& ;, unsigned int,char const *,ImageLoader :: InitializerTimingList& ;, ImageLoader :: UninitedUpwards&)(在/ usr / lib / dyld中)
    == 12768 == by 0x100012523:ImageLoader :: processInitializers(ImageLoader :: LinkContext const& ;, unsigned int,ImageLoader :: InitializerTimingList& ;, ImageLoader :: UninitedUpwards&)(在/ usr / lib / dyld中)
    = = 12768 ==通过0x1000125B8:ImageLoader :: runInitializers(ImageLoader :: LinkContext const& ;, ImageLoader :: InitializerTimingList&)(在/ usr / lib / dyld中)
    == 12768 ==地址0x10488ac6c在线程1的堆栈上
    == 12768 ==在第二帧中,由task_set_special_port(??? :)创建
    == 12768 ==未初始化值由堆栈分配
    == 12768 ==在0x1006290A6:_os_trace_create_debug_control_port(在/usr/lib/system/libsystem_trace.dylib中)
    == 12768 ==
    == 12768 ==
    == 12768 ==堆摘要:
    == 12768 ==退出时正在使用:162个块中的18,144字节
    == 12768 ==堆总使用量:178个分配,16个空闲,24,288个字节分配
    == 12768 ==
    == 12768 ==泄漏摘要:
    == 12768 ==肯定丢失:54个块中的3,456字节
    == 12768 ==间接丢失: 0个字节中的0个字节
    == 12768 ==可能丢失:3个块中的72个字节
    == 12768 ==仍可访问:6个块中的200个字节
    == 12768 ==已抑制: 14,416字节,分为99个块
    == 12768 ==用--leak-check = full重新运行以查看泄漏的内存的详细信息
    == 12768 ==
    == 12768 ==对于计数检测到并抑制的错误,重新运行:-v
    == 12768 ==错误摘要:1个上下文中有1个错误(抑制:4个中有4个)

    我不了解跟踪的这一部分:

      == 12768 == Syscall参数msg-> desc.port.name指向未初始化的字节
    == 12768 == at 0x10049434A:mach_msg_trap(in /usr/lib/system/libsystem_kernel.dylib)
    == 12768 ==通过0x100493796:mach_msg(在/usr/lib/system/libsystem_kernel.dylib中)
    == 12768 ==通过0x10048D485:task_set_special_port (在/usr/lib/system/libsystem_kernel.dylib中)
    == 12768 ==通过0x10062910E:_os_trace_create_debug_control_port(在/usr/lib/system/libsystem_trace.dylib中)
    == 12768 ==通过0x100629458 :_libtrace_init(在/usr/lib/system/libsystem_trace.dylib中)
    == 12768 ==通过0x1001599DF:libSystem_initializer(在/usr/lib/libSystem.B.dylib中)
    == 12768 ==通过0x100017A1A:ImageLoaderMachO :: doModInitFunctions(ImageLoader :: LinkContext const&)(在/ usr / lib / dyld中)
    == 12768 ==通过0x100017C1D:ImageLoaderMachO :: doInitialization(ImageLoader :: LinkContext const&)(在/ usr / lib / dyld)
    == 12768 ==通过0x1000134A9:ImageLoader :: recursiveInitialization(ImageLoader :: L inkContext const& ;, unsigned int,char const *,ImageLoader :: InitializerTimingList& ;, ImageLoader :: UninitedUpwards&)(在/ usr / lib / dyld中)
    == 12768 == by 0x100013440:ImageLoader :: recursiveInitialization(ImageLoader :: LinkContext const& ;, unsigned int,char const *,ImageLoader :: InitializerTimingList& ;, ImageLoader :: UninitedUpwards&)(在/ usr / lib / dyld中)
    == 12768 == by 0x100012523:ImageLoader :: processInitializers (ImageLoader :: LinkContext const& ;, unsigned int,ImageLoader :: InitializerTimingList& ;, ImageLoader :: UninitedUpwards&)(在/ usr / lib / dyld中)
    == 12768 ==由0x1000125B8:ImageLoader :: runInitializers(ImageLoader :: LinkContext const& ;, ImageLoader :: InitializerTimingList&)(在/ usr / lib / dyld中)
    == 12768 ==地址0x10488ac6c在线程1的堆栈中
    == 12768 ==在第2帧中,由task_set_special_port(??? :)创建。
    == 12768 ==未初始化值是由堆栈分配
    == 12768 ==在0x1006290A6处创建的:_os_trace_create_deb ug_control_port(在/usr/lib/system/libsystem_trace.dylib中)


我不明白为什么堆摘要如此之大(我的简单return(0)这么大(178个分配,16个空闲,分配了24,288个字节));

解决方案

Valgrind有一个抑制错误的系统。抑制规则在特殊文件中指定,例如 $ PREFIX / lib / valgrind / default.supp 。用户可以使用-gen-suppressions = full 帮助创建自己的规则,该帮助将为遇到的每个错误打印禁止规则。然后用户可以根据自己的需要对其进行自定义。



我这样做是为了解决有问题的错误,并且效果很好!无需安装不稳定的版本。如果您遇到其他要忽略的报告错误,这也是一个很好的工具。



我将此文件另存为〜 /.valgrind.supp

 #对于任何可执行文件(看来)都是误报
#macOS 10.12.6
#valgrind 3.13.0
{
libtrace初始化错误肯定
Memcheck:Param
msg-> desc.port.name
fun:mach_msg_trap
fun:mach_msg
fun:task_set_special_port
fun:_os_trace_create_debug_control_port
fun:_libtrace_init
}

开始评论,然后 {} 表示规则。第一行是规则的名称。第二个是要抑制的工具和错误类型。 Param 表示无效的syscall参数,下一行提供用于抑制错误的参数。以下以 fun开头的行:表示当由调用时,此禁止规则仅适用于 mach_msg_trap task_set_special_port 调用的mach_msg 等。这样,我们仅在非常特殊的情况下抑制错误,其中Valgrind将libtrace错误初始化为错误。



如果您提供参数<$ c $,Valgrind将使用此规则。 c>-suppressions = $ HOME / .valgrind.supp 在命令行上,或将其放入 $ VALGRIND_OPTS 〜/ .valgrindrc




  • 抑制错误 [Valgrind]

  • 设置默认选项 [Valgrind]

  • 编写禁止文件 [Memcheck]

  • Valgrind抑制文件如何 [wkWiki]


  • I tried to run valgrind 3.13 and 3.14 (on macOs 10.12.6) in very simple project but I got strange error who I never got in my linux before.

    1. Very simple C program main.c:

      int main() {
          return (0);
      }
      

    2. Compilation with cc:

      $> cc main.c
      

    3. Run my simple program with valgrind:

      $> valgrind ./a.out
      

    4. Output of 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)
      

      I do not understand this part of 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)
      

    I do not understand why the heap summary is so big (178 allocs, 16 frees, 24,288 bytes allocated) of my simple return(0); program.

    解决方案

    Valgrind has a system for suppressing errors. Suppression rules are specified in special files, for instance $PREFIX/lib/valgrind/default.supp. Users can create their own rules using the --gen-suppressions=full aid, which will print a suppression rule for each error encountered. The user can then customize it to their own needs.

    I did this for the error in question, and it works great! No need to install unstable versions. This is also a good tool in the belt if you run into other reported errors you'd like to ignore.

    I saved this file as ~/.valgrind.supp.

    # false positive for any executable (it seems)
    # macOS 10.12.6
    # valgrind 3.13.0
    {
        libtrace initialization false positive
        Memcheck:Param
        msg->desc.port.name
        fun:mach_msg_trap
        fun:mach_msg
        fun:task_set_special_port
        fun:_os_trace_create_debug_control_port
        fun:_libtrace_init
    }
    

    # starts a comment and {} denote a rule. The first line is the name of the rule. The second one says which tool and error type to suppress. Param means invalid syscall param, and the next line gives the parameter to suppress errors for. The following lines starting with fun: means this suppression rule only applies in mach_msg_trap when called by mach_msg called by task_set_special_port and so on. This way we only suppress the error in this very specific case where Valgrind mistakes libtrace initialization for an error.

    Valgrind will use this rule if you supply the argument --suppressions=$HOME/.valgrind.supp on the command line, or put it in $VALGRIND_OPTS or ~/.valgrindrc.

    这篇关于Valgrind macO和错误的系统调用参数msg-> desc.port.name指向未初始化的字节的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆