Macos 如何在Mac OS X中生成核心转储?
似乎我无法在MacOSX10.6.8中生成内核转储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 .. “我的当前
$ 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
就是这样,核心转储文件在
/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请参阅我对开发人员的评论,解释为什么会这样(尽管我无法确认这是我怀疑它是否相关的原因)。