Reporting and analyzing crashes (segfaults)

Итак, вам удалось сломать Julia. Поздравляю! Здесь собраны некоторые общие процедуры, которые вы можете выполнить при распространенных симптомах, возникающих, когда что-то идет не так. Включение информации из этих шагов отладки может значительно помочь разработчикам при поиске причины сегментационной ошибки или попытках выяснить, почему ваш скрипт работает медленнее, чем ожидалось.

Если вы попали на эту страницу, найдите симптом, который наилучшим образом соответствует тому, что вы испытываете, и следуйте инструкциям, чтобы сгенерировать запрашиваемую информацию для отладки. Таблица симптомов:

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: 64 default, 0 interactive, 2 GC (on 2 virtual cores) Environment: JULIA_NUM_THREADS = 64

Segfaults during bootstrap (sysimg.jl)

Сегментационные ошибки в конце процесса make при сборке Julia являются распространенным симптомом того, что что-то пошло не так во время предварительного разбора корпуса кода в папке base/. Многие факторы могут способствовать неожиданной остановке этого процесса, однако чаще всего это связано с ошибкой в части C-кода Julia, и, как правило, это необходимо отлаживать с помощью отладочной сборки внутри gdb. Явно:

Создайте отладочную сборку Julia:

$ cd <julia_root>
$ make debug

Обратите внимание, что этот процесс, вероятно, завершится с той же ошибкой, что и обычное заклинание make, однако это создаст отладочный исполняемый файл, который предоставит gdb необходимые отладочные символы для получения точных трассировок. Далее вручную запустите процесс загрузки внутри gdb:

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

Это запустит gdb, попытается выполнить процесс загрузки, используя отладочную сборку Julia, и выведет трассировку стека, если (когда) произойдет ошибка сегментации. Вам может понадобиться несколько раз нажать <enter>, чтобы получить полную трассировку стека. Создайте gist с трассировкой стека, version info и любой другой важной информацией, которую вы можете придумать, и откройте новый issue на Github с ссылкой на 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 и любой другой важной информацией, которую вы можете придумать, и откройте новый issue на Github с ссылкой на 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; например, он должен содержать такие папки, как base, deps, src, test и т. д.....