Информирование о сбоях (аварийных завершениях) и их анализ
Итак, вам удалось нарушить работу Julia. Поздравляем! Здесь приводится описание некоторых общих процедур, которые можно выполнить при распространенных симптомах, возникающих, когда что-то идет не так. Включение в отчет информации из этих шагов по отладке может значительно помочь специалистам по обслуживанию при отслеживании аварийного завершения или попытке выяснить, почему ваш скрипт работает медленнее, чем ожидалось.
Если вы были направлены на эту страницу, найдите симптом, который в наибольшей степени соответствует возникшей ситуации, и следуйте инструкциям для создания запрашиваемой отладочной информации. Таблица симптомов
Сведения о версии или среде
Независимо от ошибки, нам всегда нужно знать, какую версию Julia вы используете. При первом запуске Julia выводится заголовок с номером версии и датой. В создаваемый отчет включите, пожалуйста, вывод функции versioninfo()
(экспортированной из стандартной библиотеки InteractiveUtils
).
julia> using InteractiveUtils
julia> versioninfo()
Julia Version 1.9.3
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: Linux (x86_64-alpine-linux-musl)
CPU: 16 × Intel(R) Xeon(R) Platinum 8180 CPU @ 2.50GHz
WORD_SIZE: 64
LIBM: libopenlibm
LLVM: libLLVM-14.0.6 (ORCJIT, skylake-avx512)
Threads: 1 on 16 virtual cores
Environment:
JULIA_PKG_SERVER = http://pkgserver.pkgserver.svc.cluster.local:8000
JULIA_EXECUTABLE = /builds/engee/documentation/julia-docs/original_julia/julia/usr/bin/julia --startup-file=no
Аварийные завершения во время начальной загрузки (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 с обратной трассировкой, информацией о версии и любыми другими необходимыми сведениями, которые вы хотите предоставить, и откройте новую проблему на сайте GitHub со ссылкой на gist.
Аварийные завершения при выполнении скрипта
Эта процедура очень похожа на ту, которая описана в разделе 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 с обратной трассировкой, информацией о версии и любыми другими необходимыми сведениями, которые вы хотите предоставить, и откройте новую проблему на сайте GitHub со ссылкой на gist.
Ошибки во время запуска Julia
Иногда в процессе запуска Julia возникают ошибки (особенно при использовании двоичных дистрибутивов, в отличие от компиляции из исходного кода), например:
$ julia
exec: error -5
Эти ошибки обычно указывают на то, что что-то не загружается должным образом на самом раннем этапе загрузки. Лучшим способом определения проблемы является использование внешних инструментов для аудита работы диска в процессе julia
.
-
В Linux используйте
strace
.$ strace julia
-
On OSX, use
dtruss
:$ dtruss -f julia
Создайте gist с выводом strace
/ dtruss
, информацией о версии и любыми другими необходимыми сведениями и откройте новую проблему на сайте GitHub со ссылкой на gist.
Другие общие ошибки или недоступность
Как уже упоминалось, julia
хорошо интегрируется с rr
для генерации трассировок. В Linux сюда входит возможность автоматического запуска julia
в rr
и обмена трассировками после сбоя. Это может быть очень полезно при отладке таких сбоев и настоятельно рекомендуется сделать при информировании о сбоях в репозитории JuliaLang или julia. Чтобы автоматически запустить julia
в rr
, сделайте следующее.
julia --bug-report=rr
Чтобы генерировать трассировку rr
локально, но не использовать ее совместно, вы можете сделать следующее.
julia --bug-report=rr-local
Обратите внимание, что это работает только в Linux. Подробные сведения можно найти в публикации блога Time Travelling Bug Reporting.