Reporting and analyzing crashes (segfaults)

ジュリアを壊すことに成功しましたね。おめでとうございます!ここには、何かがうまくいかないときに遭遇する一般的な症状に対処するための手順がまとめられています。これらのデバッグ手順の情報を含めることで、セグメンテーションフォルトを追跡したり、スクリプトが予想よりも遅く実行される理由を理解する際に、メンテナが大いに助けられるでしょう。

このページにアクセスするよう指示された場合は、あなたが経験している症状に最も合致するものを見つけ、要求されたデバッグ情報を生成するための指示に従ってください。 症状の表:

Version/Environment info

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

julia> using InteractiveUtils
julia> versioninfo()Julia Version 1.11.5 Commit 760b2e5* (2025-04-14 06:53 UTC) Platform Info: OS: Linux (x86_64-linux-gnu) CPU: 2 × AMD EPYC 7763 64-Core Processor WORD_SIZE: 64 LLVM: libLLVM-16.0.6 (ORCJIT, znver3) Threads: 1 default, 0 interactive, 1 GC (on 2 virtual cores)

Segfaults during bootstrap (sysimg.jl)

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> を数回押す必要があるかもしれません。バックトレース、version info、および考えられるその他の関連情報を含む gist を作成し、GitHubで新しい issue を開いて、gistへのリンクを追加してください。

Segfaults when running a script

手順は Segfaults during bootstrap (sysimg.jl) と非常に似ています。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 のバックトレースを作成し、version info とその他の関連情報を考慮し、GitHubで新しい issue を開いて、gistへのリンクを追加してください。

Errors during Julia startup

時折、Juliaの起動プロセス中にエラーが発生することがあります(特にバイナリディストリビューションを使用している場合、ソースからコンパイルするのではなく)次のようなエラーです:

$ julia
exec: error -5

これらのエラーは通常、ブートアップフェーズの非常に早い段階で何かが正しく読み込まれていないことを示しています。何が問題なのかを特定するための最善の方法は、外部ツールを使用して julia プロセスのディスクアクティビティを監査することです。

  • Linuxでは、straceを使用します:

    $ strace julia
  • OSXでは、dtrussを使用します:

    $ dtruss -f julia

gistを作成し、strace/ dtrussの出力、version info、およびその他の関連情報を含め、新しいissueをGithubで開き、gistへのリンクを作成してください。

Other generic segfaults or unreachables reached

他の場所でも言及されているように、juliaはトレースを生成するためにrrとの良好な統合を持っています。これには、Linux上でjuliaを自動的にrrの下で実行し、クラッシュ後にトレースを共有する機能が含まれています。これは、こうしたクラッシュをデバッグする際に非常に役立ち、JuliaLang/juliaリポジトリにクラッシュの問題を報告する際には強く推奨されます。juliaを自動的にrrの下で実行するには、次のようにします:

julia --bug-report=rr

ローカルで rr トレースを生成するが、共有しない場合は、次のようにします:

julia --bug-report=rr-local

この内容はLinuxでのみ動作することに注意してください。Time Travelling Bug Reportingに関するブログ投稿には、さらに多くの詳細が記載されています。

Glossary

このガイドでは、いくつかの用語が略語として使用されています:

  • <julia_root>は、Juliaソースツリーのルートディレクトリを指します。例えば、basedepssrctestなどのフォルダが含まれている必要があります。