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 ..
現在のディレクトリ、HOMEと/ cores /は空のままです…
デフォルトでは、クラッシュは.crash
ファイルに報告され、/Library/Logs/DiagnosticReports
(システム全体)および~/Library/Logs/DiagnosticReports
(ユーザー)にあります。これらのファイルは、Consoleアプリを使用して、Userまたはシステムレポート。 .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
Segmentation faultメッセージの後に、追加の(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-カーネルコアダンプ 。
次のように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
プログラムで行うこともできます。
#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;
}
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
処理によってセグメンテーション違反が発生した場合、/cores
にコアが見つかります。上記を実行した後、これがプロセスにSIGABRTを送信していることを確認できます。
kill -ABRT 51918
ルートが所有するプロセスへのアタッチは、デフォルトでは システムの整合性保護 のため、最近のmacOS(El Capitan以降)では機能しません。