Reporting and analyzing crashes (segfaults)
Итак, вам удалось сломать Julia. Поздравляю! Здесь собраны некоторые общие процедуры, которые вы можете выполнить при распространенных симптомах, возникающих, когда что-то идет не так. Включение информации из этих шагов отладки может значительно помочь разработчикам при поиске причины сегментационной ошибки или попытках выяснить, почему ваш скрипт работает медленнее, чем ожидалось.
Если вы попали на эту страницу, найдите симптом, который наилучшим образом соответствует тому, что вы испытываете, и следуйте инструкциям, чтобы сгенерировать запрашиваемую информацию для отладки. Таблица симптомов:
- Segfaults during bootstrap (
sysimg.jl
) - Segfaults when running a script
- Errors during Julia startup
- Other generic segfaults or unreachables reached
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
и т. д.....