GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/emacs/Crashing.html ・ emacs-doc.conao3.com

53.5 Emacsがクラッシュしたとき

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’ を実行して(例えばシェルの起動スクリプト内で)明示的に有効にする必要があります。