web-dev-qa-db-ja.com

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 ..

現在のディレクトリ、HOMEと/ cores /は空のままです…

27
alexpirine

デフォルトでは、クラッシュは.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-カーネルコアダンプ

22
kenorb

次のようにMac Os Xでコアダンプファイルを生成できます。

  1. ファイルを作成します:/etc/launchd.conf、次に:

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

  2. Macを再起動します。

コアダンプファイルは/coresディレクトリ。コアダンプファイルが大きなファイルであることに注意してください。コードのトラブルシューティングが終了したら、それらを削除してください。

14
TOC

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;
}
8
jww

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以降)では機能しません。

5
adamretter