Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 如何在Mac OS X中生成核心转储?_Macos_Coredump - Fatal编程技术网

Macos 如何在Mac OS X中生成核心转储?

Macos 如何在Mac OS X中生成核心转储?,macos,coredump,Macos,Coredump,似乎我无法在MacOSX10.6.8中生成内核转储 $ ulimit -c unlimited $ ./a.out Hello world! Segmentation fault $ find ~/ -type f -name core # ls -la /cores/ total 0 drwxrwxr-t@ 2 root admin 68 24 jui 2010 . drwxrwxr-t 31 root admin 1122 17 oct 15:52 .. “我的当前

似乎我无法在MacOSX10.6.8中生成内核转储

$ ulimit -c unlimited
$ ./a.out 
Hello world!
Segmentation fault
$ find ~/ -type f -name core 

# ls -la /cores/
total 0
drwxrwxr-t@  2 root  admin    68 24 jui  2010 .
drwxrwxr-t  31 root  admin  1122 17 oct 15:52 ..

“我的当前目录”、“我的主页”和/cores/保持为空…

您可以在Mac Os X上生成内核转储文件,如下所示:

  • 创建文件:
    /etc/launchd.conf
    ,然后:

    echo“limit core unlimited”| sudo tee-a/etc/launchd.conf

  • 重新启动你的Mac


  • 就是这样,核心转储文件在
    /cores
    目录中生成。请注意,核心转储文件是大文件,因此在完成代码故障排除后,请将其删除。

    Apple列出了在其或中生成核心转储文件的多种方法

    以下是一些摘录:

    在Mac OS X 10.4之前,您可以在系统范围内启用内核转储 通过将/etc/hostconfig中的行“COREDUMPS=-NO-”更改为 “COREDUMPS=-YES-”然后重新启动

    您甚至可以通过编程实现:

    #include <sys/resource.h>
    
    static bool EnableCoreDumps(void)
    {
        struct rlimit   limit;
    
        limit.rlim_cur = RLIM_INFINITY;
        limit.rlim_max = RLIM_INFINITY;
        return setrlimit(RLIMIT_CORE, &limit) == 0;
    }
    
    #包括
    静态布尔启用CoreDumps(无效)
    {
    结构极限;
    limit.rlim_cur=rlim_无穷大;
    limit.rlim_max=rlim_无穷大;
    返回setrlimit(RLIMIT_CORE和limit)==0;
    }
    
    默认情况下,崩溃会报告到
    .crash
    文件中,这些文件可以在
    /Library/Logs/DiagnosticReports
    (系统范围)和
    ~/Library/Logs/DiagnosticReports
    (用户)中找到。这些文件可以使用Console应用程序在用户或系统报告中打开。
    .crash
    文件为纯文本格式,应包含有关崩溃的相关信息


    要激活完整的核心转储,请确保
    /cores
    目录具有当前用户的写入权限(测试人:
    touch/cores/test&&rm/cores/test
    )。此外,通过以下方式确保核心文件大小没有任何限制:

    ulimit -c unlimited
    
    核心转储文件的名称格式为:
    core
    PID

    如果目录是隐藏的,则可以通过以下方式显示隐藏的文件:

    defaults write com.apple.finder AppleShowAllFiles TRUE
    
    您可以通过以下命令进行测试:

    sleep 100 &
    killall -SIGSEGV sleep
    
    $ ulimit -c unlimited
    $ sleep 100 &
    $ killall -SIGSEGV sleep # Then press Enter few times till below message is shown
    [1]+  Segmentation fault: 11  (core dumped) sleep 100
    $ ls /cores
    core.13652
    $ lldb -c /cores/core.*
    (lldb) target create --core "/cores/core.13652"
    Core file '/cores/core.13652' (x86_64) was loaded.
    (lldb) bt
    * thread #1, stop reason = signal SIGSTOP
      * frame #0: 0x00007fffa7d13fde libsystem_kernel.dylib`__semwait_signal + 10
        frame #1: 0x00007fffa7c9ab92 libsystem_c.dylib`nanosleep + 199
        frame #2: 0x000000010c090002 sleep`rpl_nanosleep + 128
    
    在分段故障消息之后,应显示额外的
    (堆芯转储)

    默认情况下,应在
    /cores
    目录中找到核心转储文件


    命令示例:

    sleep 100 &
    killall -SIGSEGV sleep
    
    $ ulimit -c unlimited
    $ sleep 100 &
    $ killall -SIGSEGV sleep # Then press Enter few times till below message is shown
    [1]+  Segmentation fault: 11  (core dumped) sleep 100
    $ ls /cores
    core.13652
    $ lldb -c /cores/core.*
    (lldb) target create --core "/cores/core.13652"
    Core file '/cores/core.13652' (x86_64) was loaded.
    (lldb) bt
    * thread #1, stop reason = signal SIGSTOP
      * frame #0: 0x00007fffa7d13fde libsystem_kernel.dylib`__semwait_signal + 10
        frame #1: 0x00007fffa7c9ab92 libsystem_c.dylib`nanosleep + 199
        frame #2: 0x000000010c090002 sleep`rpl_nanosleep + 128
    


    另请参见:.

    在Mac OS X Yosemite上,您可以使用LLDB在每个进程的基础上启用核心转储。假设您的进程id为
    51918
    ,请从bash运行以下命令:

    $ lldb
    (lldb) attach 51918
    Process 51918 stopped
    * thread #1: tid = 0x6bf50, 0x00007fff927c14de libsystem_kernel.dylib`mach_msg_trap + 10, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
        frame #0: 0x00007fff927c14de libsystem_kernel.dylib`mach_msg_trap + 10
    libsystem_kernel.dylib`mach_msg_trap:
    ->  0x7fff927c14de <+10>: retq   
        0x7fff927c14df <+11>: nop    
    
    libsystem_kernel.dylib`mach_msg_overwrite_trap:
        0x7fff927c14e0 <+0>:  movq   %rcx, %r10
        0x7fff927c14e3 <+3>:  movl   $0x1000020, %eax
    
    Executable module set to "/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/bin/java".
    Architecture set to: x86_64h-apple-macosx.
    
    (lldb) expr long long * $limit = (long long *)malloc(16)
    (lldb) expr $limit[0] = 0x7fffffffffffffff
    (long long) $0 = 9223372036854775807
    (lldb) expr $limit[1] = 0x7fffffffffffffff
    (long long) $1 = 9223372036854775807
    (lldb) expr (int)setrlimit(4, $limit)
    (int) $2 = 0
    (lldb) detach
    Process 51918 detached
    

    请注意,默认情况下,附加到root拥有的进程在最近的MacOS(El Capitan及以上版本)上不起作用,原因是。

    可能存在副本/core/可能包含隐藏的文件,因此设置
    默认值write com.apple.finder AppleShowAllFiles TRUE
    谢谢您的回答Bort,但我已经看到了这个线程;苹果公司将核心文件保存在
    /cores
    目录中。确保目录上的权限设置正确。看苹果的。另外,您不需要一个前导点“.”以便将更改应用于当前shell和所有子shell吗?或者您可以只在终端中启用核心转储,而无需重新启动:Archive of:这是正确的,但没有真正的核心转储有用;如果您需要有关应用程序崩溃原因(以及崩溃的上下文)的更多信息,那么如果您出于任何原因无法在计算机上复制崩溃场景,那么核心转储是无法替代的。@fraveydank为了避免混淆,我简化了答案。OSX有自己的核心转储格式,并且它们有适当的上下文。这些核心转储文件可以在
    /cores
    中找到。这些核心转储指令似乎不再适用于macOS 10.13。我做了
    ulimit
    的事情,并验证了
    /cores
    是可写的,但是
    /cores
    中没有出现core,也没有出现带有“Segmentation fault”消息的“(core dumped)”消息()你知道如何在新版本的macOS上启用此功能吗?这个答案刚刚在10.14上对我起了作用,并为SIGSEGV生成了一个核心文件
    /cores/core.19098
    。从设置了
    ulimit-c unlimited
    的同一终端启动转储过程。例如,要核心转储TextEdit,请使用
    /etc/hostconfig
    文件中的完整路径
    /Applications/TextEdit.app/Contents/MacOS/TextEdit
    从命令行启动它。注释说:
    此文件即将消失
    ,因此此文件将很快贬值。以前在
    hostconfig
    中找到的首选项类型现在包含在launchd.plist文件中。例如,当您在系统首选项中关闭AFP共享时,它会添加到
    /System/Library/LaunchDaemons
    中的
    com.apple.AppleFileServer.plist
    中,我很想否决这一点,因为它引用了可怕的csh。。。好吧,不是真的。但这是一个很好的解释点(所以csh或否我投了赞成票)
    setrlimit()。系统应该接收到这个吗?我需要在JVM设置中启用核心转储吗?默认情况下有没有办法在崩溃程序的目录下生成核心转储文件?这个解决方案对我也不起作用。我严格按照说明进行操作,并仔细检查了我的文件名和launchd.conf@Developer的内容。我相信,在较新版本的macOS中,已经发生了某种变化。我尝试了另一个极限,但它似乎不起作用。或者我认为这是一个极限。当然,我确实使用了那个文件,但并没有成功,所以可能它在2015年已经改变了。@Jason请参阅我对开发人员的评论,解释为什么会这样(尽管我无法确认这是我怀疑它是否相关的原因)。