Reporting and analyzing crashes (segfaults)

Also haben Sie es geschafft, Julia zu brechen. Herzlichen Glückwunsch! Hier sind einige allgemeine Verfahren, die Sie bei häufigen Symptomen durchführen können, wenn etwas schiefgeht. Die Einbeziehung der Informationen aus diesen Debugging-Schritten kann den Entwicklern erheblich helfen, wenn sie einen Segfault nachverfolgen oder herausfinden, warum Ihr Skript langsamer als erwartet läuft.

Wenn Sie zu dieser Seite geleitet wurden, finden Sie das Symptom, das am besten zu dem passt, was Sie erleben, und folgen Sie den Anweisungen, um die angeforderten Debugging-Informationen zu generieren. Tabelle der Symptome:

Version/Environment info

Egal welcher Fehler auftritt, wir müssen immer wissen, welche Version von Julia Sie verwenden. Wenn Julia zum ersten Mal gestartet wird, wird ein Header mit einer Versionsnummer und einem Datum ausgegeben. Bitte fügen Sie auch die Ausgabe von versioninfo() (exportiert aus der InteractiveUtils Standardbibliothek) in jeden Bericht ein, den Sie erstellen:

julia> using InteractiveUtils
julia> versioninfo()Julia Version 1.11.4 Commit 8561cc3d68* (2025-03-10 11:36 UTC) Build Info: Note: This is an unofficial build, please report bugs to the project responsible for this build and not to the Julia project unless you can reproduce the issue using official builds available at https://julialang.org/downloads Platform Info: OS: macOS (arm64-apple-darwin24.3.0) CPU: 12 × Apple M2 Max WORD_SIZE: 64 LLVM: libLLVM-16.0.6 (ORCJIT, apple-m2) Threads: 128 default, 0 interactive, 8 GC (on 8 virtual cores) Environment: JULIA_PKG_USE_CLI_GIT = true JULIA_PROJECT = @. JULIA_NUM_THREADS = 128

Segfaults during bootstrap (sysimg.jl)

Segfaults gegen Ende des make-Prozesses beim Erstellen von Julia sind ein häufiges Symptom dafür, dass etwas schiefgeht, während Julia den Code im base/-Ordner vorverarbeitet. Viele Faktoren können dazu führen, dass dieser Prozess unerwartet abbricht, jedoch liegt es oft an einem Fehler im C-Code-Teil von Julia, und muss daher typischerweise mit einem Debug-Build innerhalb von gdb debuggt werden. Explizit:

Erstellen Sie einen Debug-Build von Julia:

$ cd <julia_root>
$ make debug

Beachten Sie, dass dieser Prozess wahrscheinlich mit demselben Fehler wie ein normales make-Kommando fehlschlagen wird. Allerdings wird dadurch ein Debug-Executable erstellt, das gdb die benötigten Debugging-Symbole bietet, um genaue Rückverfolgungen zu erhalten. Führen Sie als Nächstes den Bootstrap-Prozess manuell innerhalb von gdb aus:

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

Dies wird gdb starten, versuchen, den Bootstrap-Prozess mit dem Debug-Build von Julia auszuführen, und einen Backtrace ausgeben, falls (wenn) es zu einem Segfault kommt. Möglicherweise müssen Sie ein paar Mal <enter> drücken, um den vollständigen Backtrace zu erhalten. Erstellen Sie eine gist mit dem Backtrace, der version info und allen anderen relevanten Informationen, die Sie sich vorstellen können, und öffnen Sie ein neues issue auf Github mit einem Link zum Gist.

Segfaults when running a script

Das Verfahren ist sehr ähnlich zu Segfaults during bootstrap (sysimg.jl). Erstellen Sie einen Debug-Build von Julia und führen Sie Ihr Skript innerhalb eines debugged Julia-Prozesses aus:

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

Beachten Sie, dass gdb dort sitzen bleibt und auf Anweisungen wartet. Geben Sie r ein, um den Prozess auszuführen, und bt, um einen Backtrace zu erstellen, sobald er einen Segfault hat:

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

Erstellen Sie ein gist mit dem Backtrace, der version info, und allen anderen relevanten Informationen, die Sie sich vorstellen können, und öffnen Sie ein neues issue auf Github mit einem Link zum Gist.

Errors during Julia startup

Gelegentlich treten während des Startprozesses von Julia Fehler auf (insbesondere bei der Verwendung von Binärdistributionen im Gegensatz zum Kompilieren aus dem Quellcode), wie zum Beispiel:

$ julia
exec: error -5

Diese Fehler deuten typischerweise darauf hin, dass etwas sehr früh im Bootvorgang nicht richtig geladen wird, und unser bester Ansatz zur Bestimmung, was schiefgeht, ist die Verwendung externer Tools, um die Festplattenaktivität des julia-Prozesses zu überprüfen:

  • Auf Linux verwenden Sie strace:

    $ strace julia
  • Auf OSX verwenden Sie dtruss:

    $ dtruss -f julia

Erstellen Sie ein gist mit der strace/ dtruss Ausgabe, der version info, und allen anderen relevanten Informationen und öffnen Sie ein neues issue auf Github mit einem Link zum Gist.

Other generic segfaults or unreachables reached

Wie an anderer Stelle erwähnt, hat julia eine gute Integration mit rr zur Generierung von Traces; dies umfasst unter Linux die Möglichkeit, julia automatisch unter rr auszuführen und den Trace nach einem Absturz zu teilen. Dies kann beim Debuggen solcher Abstürze äußerst hilfreich sein und wird dringend empfohlen, wenn Absturzprobleme im JuliaLang/julia-Repo gemeldet werden. Um julia automatisch unter rr auszuführen, tun Sie Folgendes:

julia --bug-report=rr

Um den rr-Trace lokal zu generieren, aber nicht zu teilen, können Sie Folgendes tun:

julia --bug-report=rr-local

Beachten Sie, dass dies nur unter Linux funktioniert. Der Blogbeitrag zu Time Travelling Bug Reporting enthält viele weitere Details.

Glossary

Einige Begriffe wurden in diesem Leitfaden als Abkürzungen verwendet:

  • <julia_root> bezieht sich auf das Stammverzeichnis des Julia-Quellbaums; z. B. sollte es Ordner wie base, deps, src, test usw. enthalten.....