Как сгенерировать основные дампы в 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 следующим образом:

  • Создайте файл: /etc/launchd.conf, затем:

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

  • Перезагрузите Mac.

И что это, файлы дампа ядра генерируются в каталоге /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.