クラッシュ(セグメンテーションフォルト)の報告と分析

クラッシュ(セグメンテーションフォルト)の報告と分析

Julia を壊した?おめでとうございます! 何かおかしいことが起きた時によく遭遇する症状に対する一般的な手順をここに集めました。セグメンテーションフォールトを追跡したり、あなたのスクリプトが予想よりも遅い理由を突き止める際には、ここで述べるデバッグ手順から得られる情報を含めて報告すると、メンテナは大いに助かるでしょう。

もしあなたが、このページを見るように、と言われたのであれば、今直面している問題に最も一致する現象を見つけて、このページに書かれた指示に従って、要求されたデバッグ情報を生成してください。現象の一覧は下記の通りです:

バージョン情報/環境情報

エラーの内容に関係なく、常に、実行しているJulia のバージョンを知る必要があります。Julia が最初に起動すると、ヘッダーにバージョン番号と日付が出力されます。また、作成するレポートには、versioninfo()(InteractiveUtils 標準ライブラリからエクスポートされています) の出力を含めてください:

julia> using InteractiveUtils

julia> versioninfo()
Julia Version 1.3.0
Commit 46ce4d7933 (2019-11-26 06:09 UTC)
Platform Info:
  OS: Linux (x86_64-linux-gnu)
  CPU: Intel(R) Xeon(R) W-2155 CPU @ 3.30GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-6.0.1 (ORCJIT, skylake)

ブートストラップ(sysimg.jl)中のセグメンテーションフォルト

Julia をビルドする make プロセスの終盤でのセグメンテーションフォールトは、一般的な症状です。Julia がbase/フォルダ内のコードのコーパスを事前解析している間に何かがおかしいことが起きたりします。 プロセスが突然落ちてしまう原因には、多くの要因が考えられますが、どちらかというと、Julia の C コード部分のエラーが原因であることが多く、通常は gdb のデバッグビルドでデバッグしなければならないことが多いです。デバッグビルドを作るには明示的に:

Julia のデバッグビルドを作成します:

$ cd <julia_root>
$ make debug

このデバッグビルドのプロセスは、通常のmake と同じエラーで失敗する可能性がありますが、(そうならなければ) 正確なバックトレースをするために必要なデバッグシンボルを gdbに提供する、デバッグ用実行可能ファイルが作成されます。 次に、gdb内でブートストラッププロセスを手動で実行します:

$ cd base/
$ gdb -x ../contrib/debug_bootstrap.gdb

このコマンドで、gdbを開始し、Julia のデバッグビルドを使用したブートストラッププロセスを実行しようとし、もしセグメンテーションフォルトが起きれば、バックトーレスの結果を出力します。全ての出力を得るには、なんどか <enter>キーを押す必要があるかもしれません。こうして得られたバックトレースと、バージョン情報、その他関連情報をまとめた gist を作成して、Github の issue をオープンし、作成したgistへのリンクを貼ってください。

スクリプトの実行時のセグフォールト

この手順は、スクリプトの実行時のセグフォールトに非常によく似ています。 Julia のデバッグ ビルドを作成し、デバッグされた Julia プロセス内でスクリプトを実行します:

$ cd <julia_root>
$ make debug
$ gdb --args usr/bin/julia-debug <path_to_your_script>

gdb は起動しただけでは何もしません。ただ命令を待っている状態です。r と打って、プロセスを実行します。btでセグメンテーションフォルトが発生した時に、バックトレースを生成します:

(gdb) r
Starting program: /home/sabae/src/julia/usr/bin/julia-debug ./test.jl
...
(gdb) bt

得られたバックトーレスの内容、バージョン情報、その他関連情報をまとめて、gist を作成して、Github の issue をオープンし作成したgistへのリンクを貼ってください。

Julia起動中のエラー

Julia の起動中 (ソースからコンパイルしたものでなく、特にバイナリ配布されているもの実行したとき)に時々エラーが起きます。例えば下記の様なものです:

$ julia
exec: error -5

このようなエラーの典型的な原因は、Julia 起動のごくごく初期段階で、何かが正しくロードされていないことだったりします。何が悪いかを判断するのに最もおすすめなのは、Julia processがディスクにどうアクセスしているかを監査する外部ツールを使うことです:

strace/dtrussの出力、バージョン情報、その他関連情報をまとめて、gist を作成して、Github の issue をオープンし作成したgistへのリンクを貼ってください。

用語集

このガイドとしては、いくつかの用語が短縮記号として使われている: