Как сгенерировать дампы ядра в 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
drwxrwxr-t@  2 root  admin    68 24 jui  2010 .
drwxrwxr-t  31 root  admin  1122 17 oct 15:52 ..

Мой текущий каталог, мой ДОМ и / cores / остаются пустыми ...


person alexpirine    schedule 23.02.2012    source источник
comment
возможный дубликат где записаны дампы ядра . / core / может содержать скрытые файлы, поэтому установите defaults write com.apple.finder AppleShowAllFiles TRUE   -  person Bort    schedule 23.02.2012
comment
Спасибо за ответ, Борт, но я уже видел эту ветку; дело не в скрытых файлах.   -  person alexpirine    schedule 23.02.2012
comment
Apple сохраняет файлы ядра в каталоге /cores. Убедитесь, что права доступа к каталогу установлены правильно. См. волшебство отладки Mac OS X от Apple. Кроме того, вам не нужна ведущая точка. Значит, изменения применяются к текущей оболочке и всем дочерним оболочкам?   -  person jww    schedule 28.11.2013
comment
Или вы можете просто включить дампы ядра в своем терминале без перезапуска: mindarray.org/techlog/gdb- debugging.html   -  person David Mertens    schedule 15.05.2014
comment
И если вы не хотите использовать / cores, вы всегда можете создать символическую ссылку в своем домашнем каталоге (или где угодно), чтобы указать на / cores, хотя это только добавит способ ссылки на файл.   -  person Pryftan    schedule 29.06.2019
comment
Архив: mindarray.org /techlog/gdb-debugging.html   -  person M.W.    schedule 25.03.2020


Ответы (4)


По умолчанию о сбоях сообщается в .crash файлах, которые можно найти в /Library/Logs/DiagnosticReports (общесистемный) и ~/Library/Logs/DiagnosticReports (пользовательский). Эти файлы можно открыть с помощью приложения Console в User или System Reports. Файлы .crash имеют простой текстовый формат и должны включать соответствующую информацию о сбое.


Чтобы активировать полные дампы ядра, убедитесь, что каталог /cores имеет права записи для текущего пользователя (проверка: touch /cores/test && rm /cores/test). Кроме того, убедитесь, что у вас нет ограничений на размер файла ядра:

ulimit -c unlimited

Имя файла дампа ядра имеет формат: _8 _._ 9_.

Если каталог скрыт, вы можете отобразить скрытые файлы следующим образом:

defaults write com.apple.finder AppleShowAllFiles TRUE

Вы можете проверить это с помощью следующих команд:

sleep 100 &
killall -SIGSEGV sleep

в котором должно быть указано extra (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

См. Также: Техническое примечание TN2118 - дампы ядра ядра.

person kenorb    schedule 23.01.2014
comment
Это верно, но не так полезно, как настоящий дамп ядра; Если вам нужна дополнительная информация о почему произошел сбой приложения (и контексте сбоя), нет никакой замены дампу ядра, если вы не можете воспроизвести сценарий сбоя на своем компьютере по какой-либо причине. - person fraveydank; 18.05.2014
comment
@fraveydank Я упростил ответ, чтобы избежать путаницы. В OS X есть собственный формат дампов ядра и соответствующий контекст. Эти файлы дампа ядра можно найти в /cores. - person kenorb; 06.10.2016
comment
Эти инструкции дампа ядра больше не работают в macOS 10.13. Я сделал ulimit и убедился, что /cores доступен для записи, но в /cores не отображается ядро, и не появляется сообщение (дамп ядра) вместе с сообщением об ошибке сегментации (gist.github.com/apjanke/756bdae743e6a220b49d910bd4baf4f0) Есть идеи, как включить это в новых версиях macOS? - person Andrew Janke; 21.01.2019
comment
Этот ответ только что сработал для меня в версии 10.14 и создал файл ядра /cores/core.19098 для SIGSEGV. - person user3093235; 06.09.2019
comment
Запустите процесс, который нужно выгрузить, с того же терминала, на котором был установлен ulimit -c unlimited. Например. в основной дамп TextEdit, запустите его из командной строки, используя полный путь /Applications/TextEdit.app/Contents/MacOS/TextEdit - person M.W.; 25.03.2020
comment
Не работает в версии 10.15.4 (с использованием ulimit -c unlimited и sleep теста, показанного выше). Каталог / cores доступен для записи всем, но я не администратор этого компьютера; не знаю, связано это или нет. - person Joe Strout; 14.04.2020
comment
... и просто в качестве продолжения: теперь попробуйте еще раз с учетной записью администратора, это все еще не работает. - person Joe Strout; 14.04.2020
comment
у меня не работает 2021 с macos BigSur - person kyb; 15.03.2021
comment
2021 год работает, если вы также sudo chown (whoami) / cores или sudo chown $ (whoami) / cores - person StefanS; 14.07.2021

Вы можете сгенерировать файлы дампа ядра на Mac Os X следующим образом:

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

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

  2. Перезагрузите ваш Mac.

И все, файлы дампа ядра создаются в каталоге /cores. Будьте осторожны, файлы дампа ядра - это большие файлы, поэтому, когда вы закончите устранение неполадок в коде, удалите их.

person TOC    schedule 25.08.2012
comment
Я сделал это, и ничего не вышло иначе. Система должна это уловить? Нужно ли включать дамп ядра в настройках JVM? - person Developer; 09.12.2015
comment
Есть ли способ по умолчанию сгенерировать файл дампа ядра в каталоге сбойной программы? - person Fermat's Little Student; 11.12.2015
comment
Это решение у меня тоже не сработало. Я точно выполнил инструкции и дважды проверил свое имя файла и содержимое launchd.conf. - person Jason; 12.06.2018
comment
@Developer Я считаю, что в более поздних версиях macOS произошли какие-то изменения. Я попробовал это с другим пределом, и это, похоже, не сработало. По крайней мере, я думаю, это был предел. Конечно, я использовал этот файл и не добился успеха, так что, возможно, он уже был изменен в 2015 году. - person Pryftan; 29.06.2019
comment
@Jason См. Мой комментарий для разработчика о том, почему это может быть (хотя я не могу подтвердить, почему я почему-то подозреваю, что это актуально). - person Pryftan; 29.06.2019

Apple перечисляет несколько способов создания файлов дампа ядра в своем TN2124 или Mac OS X Debugging Magic.

Вот пара отрывков:

До 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;
}
person jww    schedule 28.11.2013
comment
В /etc/hostconfig файле комментарий гласит: This file is going away, так что этот файл скоро будет обесцениваться. Тип предпочтений, ранее обнаруженный в hostconfig, теперь содержится в самих файлах launchd .plist. Например, когда вы отключаете общий доступ к AFP в Системных настройках, он добавляется к com.apple.AppleFileServer.plist в /System/Library/LaunchDaemons - person kenorb; 11.10.2014
comment
Я испытываю искушение проголосовать против этого просто из-за ссылки на ужасный csh ... Ладно, не совсем. Но это хороший момент для объяснения (и так csh или нет, я проголосовал за это) setrlimit() для тех, кто не знает об этом (знаю, но подозреваю, что многие не знают - хотя я он всегда был ulimit -c unlimited включен, поэтому он никогда не понадобился для дампа ядра). - person Pryftan; 29.06.2019

В 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, не будет работать по умолчанию в последних версиях macOS (El Capitan и выше) из-за Защита целостности системы.

person adamretter    schedule 24.01.2016