好像我无法在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 - 内核核心转储.
TOC*_*TOC 14
您可以在Mac Os X上生成核心转储文件,如下所示:
创建文件:/etc/launchd.conf,然后:
echo "limit core unlimited" | sudo tee -a /etc/launchd.conf
重启你的Mac.
就是这样,核心转储文件在/cores目录中生成.请注意核心转储文件是大文件,因此在完成代码故障排除后,请将其删除.
Apple列出了许多在TN2124或Mac 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)
在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及更高版本)起作用.
| 归档时间: |
|
| 查看次数: |
36287 次 |
| 最近记录: |