Как сгенерировать основные дампы в Mac OS X?
Похоже, я не могу генерировать дампы ядра в 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
[email protected] 2 root admin 68 24 jui 2010 .
drwxrwxr-t 31 root admin 1122 17 oct 15:52 ..
Мой текущий каталог, мой HOME и/core/остаются пустыми...
Ответы
Ответ 1
Вы можете создавать файлы дампа ядра в Mac Os X следующим образом:
И что это, файлы дампа ядра генерируются в каталоге /cores
. Будьте осторожны, чтобы файлы дампа ядра были большими файлами, поэтому, когда вы завершаете устранение неполадок вашего кода, удалите их.
Ответ 2
Чтобы активировать генерацию дампов ядра, каталог /cores/
должен существовать, и пользователь, запускающий программу, должен иметь права на запись. Кроме того, убедитесь, что у вас нет ограничений на размер основных файлов:
ulimit -c unlimited
Формат файла дампа ядра core
. PID
.
Если каталог скрыт, вы можете показать скрытые файлы:
defaults write com.apple.finder AppleShowAllFiles TRUE
Вы можете проверить это с помощью следующих команд:
sleep 100 &
killall -SIGSEGV sleep
который должен сказать дополнительно (core dumped)
, после сообщения о сбое сегментации.
Файлы дампа ядра должны быть найдены по умолчанию в каталоге /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
См. также: Техническая нота TN2118 - Ядра ядра ядра.
Ответ 3
Apple перечисляет несколько способов генерации файлов дампа ядра в TN2124 или Mac OS X отлаживающая магия.
Вот несколько выписок:
До Mac OS X 10.4 вы должны включить дампы ядра в общесистемной основываясь на изменении строки "COREDUMPS = -NO-" в /etc/hostconfig до "COREDUMPS = -YES-", а затем перезапуск
И
# BSH
$ ulimit -c unlimited
# CSH
% limit coredumpsize unlimited
Вы можете сделать это программно:
#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;
}
Ответ 4
В Mac OS X Yosemite вы можете включить дамп ядра на основе каждого процесса, используя LLDB. Предполагая, что ваш идентификатор процесса 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
Если процесс обрабатывает ошибку сегментации, вы теперь найдете ядро в /cores
. Вы можете проверить это, отправив SIGABRT в ваш процесс после выполнения вышеперечисленного:
kill -ABRT 51918
Обратите внимание, что привязка к процессу, принадлежащая root, по умолчанию не работает с последними макросами (El Capitan и выше) из-за System Integrity Protection.