GraalVM Native Image позволяет заблаговременно компилировать Java-приложения в собственные исполняемые файлы, чтобы добиться низкого потребления памяти и высокой производительности. Для отладки таких нативных исполняемых файлов вы можете использовать gdb из командной строки, но теперь также можно отлаживать приложения с собственными изображениями непосредственно из VS Code для пользователей GraalVM Enterprise. Эта функция также включена в планы Community Edition.

Давайте посмотрим, как пакет расширений GraalVM для Java позволяет устанавливать точки останова, создавать часы и проверять состояние запущенных приложений.

Что вам понадобится

  1. Linux с GDB 10.1 или 7.11.
  2. VS Code устанавливается вместе с GraalVM Extension Pack for Java
  3. GraalVM Enterprise Edition 21.3.0, включая собственный образ
  4. Ваша установка GraalVM 21.3.0 выбрана как активная в VS Code

Мы будем использовать пример приложения, которое вычисляет факториал числа, чтобы продемонстрировать эту функцию. Чтобы получить приложение, клонируйте graalvm-demos с GitHub и откройте папку javagdbnative в вашем VS Code:

$ git clone https://github.com/graalvm/graalvm-demos.git

Вот код нашего приложения:

Создайте

Мы используем проект на основе Maven, но можно использовать и Gradle. Мы будем использовать Native Build Tools для собственного образа GraalVM, что очень упрощает создание собственных исполняемых файлов.

Файл Maven pom.xml был дополнен родным профилем. Использование профиля Maven делает создание нативного исполняемого файла из кода нашего приложения очень простым (узнайте о профилях Maven здесь). Чтобы добавить отладочную информацию в созданный собственный исполняемый файл, мы можем использовать теги <buildArg> в собственном профиле для передачи параметров в процесс сборки собственного образа. Это позволяет нам настроить, как происходит сборка.

...
 <buildArg>-g</buildArg> 
 <buildArg>-O0</buildArg>
...

Где -g указывает утилите собственного образа генерировать отладочную информацию, а -O0 указывает не выполнять никаких оптимизаций. Инструмент собственного образа GraalVM Enterprise генерирует всю необходимую отладочную информацию для GDB, поэтому доступны все функции, с которыми вы привыкли работать в обычном отладчике IDE.

После обновления pom.xml file мы можем создать собственный исполняемый файл нашего примера приложения, выполнив следующую команду из терминала VS Code:

$ mvn -Pnative -DskipTests package

После создания исполняемого файла с символами отладки последним необходимым шагом настройки является добавление конфигурации отладчика Native Image в VSCode launch.json.

Выберите «Выполнить | Добавить конфигурацию…», а затем выберите «Собственный образ: запуск» из списка доступных конфигураций. В файл launch.json будет добавлен следующий код:

{
 “type”: “nativeimage”,
 “request”: “launch”,
 “name”: “Launch Native Image”,
 “nativeImagePath”: “${workspaceFolder}/build/native-image/application”
 }

Значение свойства nativeImagePath должно соответствовать имени исполняемого файла и местоположению, указанному в Maven pom.xml, поэтому измените последнюю строку конфигурации на:

“nativeImagePath”: “${workspaceFolder}/target/javagdb

И добавьте аргумент, чтобы указать число, для которого мы хотим вычислить факториал: “args”: “100”.

Ваша конфигурация должна выглядеть так:

{
 “type”: “nativeimage”,
 “request”: “launch”,
 “name”: “Launch Native Image”,
 “nativeImagePath”: “${workspaceFolder}/target/javagdb”,
 “args”: “100”
 }

Беги!

Чтобы запустить приложение в режиме отладки, перейдите на панель действий «Запуск и отладка», выберите «Запустить собственный образ» и нажмите зеленую стрелку, чтобы запустить эту конфигурацию. VS Code запустит ваше собственное приложение и подключится к приложению, что позволит вам отлаживать его.

С помощью этой настройки вы можете отлаживать исполняемый файл Native Image точно так же, как и любую другую программу Java из вашей IDE. Вы можете установить точки останова, пройтись по коду, изучить локальные переменные и указать выражения для оценки и наблюдать за ними на вкладке «Наблюдение»:

Визуализация достижимости

Еще одна замечательная функция расширений VS Code GraalVM Extensions для Java — визуализация анализа достижимости. Во время сборки собственного образа GraalVM Native Image выполнит статический анализ вашего приложения и удалит код, который не используется приложением, это может быть неиспользуемый библиотечный код или недостижимые методы. Расширение VS Code теперь распознает эти исключения и выделяет серым цветом как тело исключенного метода, так и вызов метода.

В нашем примере neverCalledMethod() никогда не вызывается. Мы можем увидеть, как это отображается в VS Code при использовании наших расширений VS Code:

Посмотрите этот видео-урок для более подробной информации:

Заключение

С пакетом расширения GraalVM для Java команда GraalVM упростила еще одну задачу разработки для разработчиков GraalVM. Теперь можно отлаживать собственные исполняемые файлы точно так же, как и обычные Java-программы. Символы отладки в настоящее время доступны только в GraalVM Enterprise, но скоро появятся в GraalVM Community Edition. Как только они станут доступны в Community Edition, вы также сможете использовать расширения VS Code для отладки собственных исполняемых файлов, созданных из Community Edition.

Мы с нетерпением ждем ваших отзывов об этой функции на GitHub, Twitter или Slack.

Начало работы с собственным образом GraalVM: https://www.graalvm.org/native-image/

Начните работу с пакетом расширений GraalVM для Java: установите из магазина VS Code.