Информирование о сбоях (аварийных завершениях) и их анализ

Итак, вам удалось нарушить работу 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-linux-gnu)
  CPU: 4 × 11th Gen Intel(R) Core(TM) i3-1115G4 @ 3.00GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-14.0.6 (ORCJIT, tigerlake)
  Threads: 1 on 4 virtual cores
Environment:
  JULIA_EXECUTABLE = /mnt/c/For_GIT/julia-1.9.3/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.

Глоссарий

Следующие несколько терминов используются в этом руководстве в качестве сокращений.

  • <julia_root> — это корневой каталог дерева исходного кода Julia. Например, он должен содержать папки, такие как base, deps, src, test и т. д.