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

ale*_*ine 23 macos coredump

好像我无法在Mac OS X 10.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 ..
Run Code Online (Sandbox Code Playgroud)

我当前的目录,我的HOME和/ cores /仍为空...

ken*_*orb 24

默认情况下,崩溃报告到.crash其可以在找到的文件/Library/Logs/DiagnosticReports(系统级)和~/Library/Logs/DiagnosticReports(用户).可以使用控制台应用程序在用户系统报告中打开这些文件.这些.crash文件采用纯文本格式,并应包含有关崩溃的相关信息.


要激活完整核心转储,请确保该/cores目录具有当前用户的写入权限(test by:)touch /cores/test && rm /cores/test.此外,请确保您对核心文件大小没有任何限制:

ulimit -c unlimited
Run Code Online (Sandbox Code Playgroud)

核心转储文件的名称格式为:core.PID.

如果目录被隐藏,您可以通过以下方式显示隐藏文件:

defaults write com.apple.finder AppleShowAllFiles TRUE
Run Code Online (Sandbox Code Playgroud)

您可以通过以下命令对其进行测试:

sleep 100 &
killall -SIGSEGV sleep
Run Code Online (Sandbox Code Playgroud)

(core dumped)Segmentation fault消息之后应该说是额外的.

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


命令示例:

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

另请参见:技术说明TN2118 - 内核核心转储.

  • 这些核心转储指令似乎不再适用于macOS 10.13。我做了ulimit事情,并验证了/ cores是可写的,但是在/ cores中没有核心出现,并且没有“((core dumped)”)消息出现,并且出现了“ Segmentation fault”消息(https:// gist .github.com / apjanke / 756bdae743e6a220b49d910bd4baf4f0)有什么想法如何针对较新的macOS版本启用此功能? (3认同)
  • 这个答案刚刚在 10.14 上对我有用,并为 SIGSEGV 生成了一个核心文件“/cores/core.19098”。 (2认同)
  • 如果您还使用 sudo chown (whoami) /cores 或 sudo chown $(whoami) /cores,则 2021 年有效 (2认同)

TOC*_*TOC 14

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

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

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

  2. 重启你的Mac.

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

  • 我做到了,没有什么不同。系统应该接受它吗?我是否需要在 JVM 设置中启用核心转储? (2认同)
  • 默认情况下,有什么方法可以在崩溃的程序目录中生成核心转储文件吗? (2认同)
  • 这个解决方案对我来说也不起作用。我严格按照说明进行操作,并仔细检查了我的文件名和 launchd.conf 的内容。 (2认同)

jww*_*jww 9

Apple列出了许多在TN2124Mac OS X Debugging Magic中生成核心转储文件的方法.

这里有几个摘录:

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

# BSH
$ ulimit -c unlimited

# CSH
% limit coredumpsize unlimited
Run Code Online (Sandbox Code Playgroud)

您甚至可以以编程方式执行此操作:

#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;
}
Run Code Online (Sandbox Code Playgroud)


ada*_*ter 5

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

如果您处理导致分段错误,您现在将找到一个核心/cores.执行上述操作后,您可以检查这是否正在向您的进程发送SIGABRT:

kill -ABRT 51918
Run Code Online (Sandbox Code Playgroud)

请注意,由于系统完整性保护,默认情况下,附加到root拥有的进程不会对最近的macOSes(El Capitan及更高版本)起作用.