Emacsはクラッシュしない仕様となっていますが、万が一クラッシュした場合には、終了前にクラッシュレポートが出力されます。このクラッシュレポートは標準エラーストリームに出力されます。GNUまたはUnixシステム上のグラフィカルデスクトップからEmacsを起動した場合、標準エラーストリームは通常~/.xsession-errorsなどのファイルにリダイレクトされるため、そこでクラッシュレポートを確認できます。MS-Windowsでは、標準エラーストリームに加えて、Emacsプロセスのカレントディレクトリにあるemacs_backtrace.txtというファイル名のファイルにクラッシュレポートが書き出されます。
クラッシュレポートの形式はプラットフォームによって異なります。GNU Cライブラリを使用しているプラットフォームなどでは、クラッシュレポートにクラッシュ直前の実行状態を示すバックトレースが含まれており、これを利用してクラッシュのデバッグを行うことができます。以下にGNUシステムでの例を示します。
Fatal error 11: Segmentation fault Backtrace: emacs[0x5094e4] emacs[0x4ed3e6] emacs[0x4ed504] /lib64/libpthread.so.0[0x375220efe0] /lib64/libpthread.so.0(read+0xe)[0x375220e08e] emacs[0x509af6] emacs[0x5acc26] ...
数値 ‘11’
は、クラッシュ(この場合はセグメンテーション違反)に対応するシステムシグナル番号です。16進数の数値はプログラムのアドレスであり、デバッグツールを使用してソースコードの行と関連付けることができます。例えば、GDBコマンド
‘list *0x509af6’ は、‘emacs[0x509af6]’ のエントリに対応するソースコードの行を出力します。システムに
addr2line
ユーティリティが搭載されている場合、以下のシェルコマンドでソースコードの行番号付きのバックトレースを出力できます:
sed -n 's/.*\[\(.*\)]$/\1/p' backtrace | addr2line -C -f -i -p -e bindir/emacs-binary
MS-Windowsでは、バックトレースの表示が若干異なります。例えば:
Backtrace: 00007ff61166a12e 00007ff611538be1 00007ff611559601 00007ff6116ce84a 00007ff9b7977ff0 ...
したがって、sed によるフィルタリングは不要であり、ソースコードの行番号を表示するコマンドは
addr2line -C -f -i -p -e bindir/emacs-binary < backtrace
ここで、backtrace はバックトレースのコピーを含むテキストファイルの名前(MS-Windows
では Emacs を起動したディレクトリ内の emacs_backtrace.txt)、bindir は Emacs 実行ファイルが格納されているディレクトリの名前、emacs-binary は Emacs 実行ファイルの名前(通常、GNU および Unix システムでは
emacs、MS-Windows および MS-DOS では emacs.exe)です。お使いの addr2line
のバージョンが古すぎてこのオプションが利用できない場合は、-p オプションを省略してください。
オプションとして、コアファイルをサポートするシステムでは、Emacsがクラッシュ時にコアダンプを生成できます。コアダンプとは、クラッシュ前のプログラムの状態に関する膨大なデータを含むファイルであり、通常はGDBなどのデバッガに読み込んで解析します。多くのプラットフォームでは、コアダンプはデフォルトで無効になっており、シェルコマンド ‘ulimit -c unlimited’ を実行して(例えばシェルの起動スクリプト内で)明示的に有効にする必要があります。