Nano Hash - криптовалюты, майнинг, программирование

Как отлаживать Java-код, работающий внутри JVM, созданной с помощью собственного кода?

Как я могу использовать Eclipse для отладки кода Java, работающего внутри моей собственной JVM, созданной на C ++? У меня есть собственное приложение, которое выполняет следующие функции:

JavaVM *javaVM;
JNIEnv *jniEnv;
long flag = JNI_CreateJavaVM(&javaVM, (void**) &jniEnv, &vmArgs);
jclass jcls = env->FindClass("my/namespace/Demo");
// then run code 
[...]

Оттуда я запускаю часть своего Java-кода. Очень важно, чтобы у меня была полноценная среда Eclipse и отладчик, чтобы я мог ежедневно писать и отлаживать свой Java-код в хороших условиях.

У меня следующий вопрос: как я могу все настроить?

Например, в Windows с Visual Studio я могу:

  • создать виртуальную машину .NET из приложения C ++
  • напишите код C # для запуска с этой виртуальной машины.
  • для отладки моего кода C #, который будет размещен в DLL (очевидно, не в JAR), мне просто нужно указать, что отладчик должен запускать исполняемый файл приложения C ++. Точки останова C # будут достигнуты автоматически, когда я начну отладку. Я также могу использовать ::DebugBreak() средства (или эквиваленты C #).

Единственное, что я обнаружил, что отдаленно похоже на мой вопрос, это

Отладка приложения Java без запуска JVM с помощью отладки аргументы

а вопрос 9 лет.

Лучший,

MF

NB: обратите внимание, что я НЕ пытаюсь отлаживать код JNI C ++, который запускается из приложения Java. Я добавляю тег jni в свой вопрос, так как подозреваю, что здесь могут помочь сотрудники JNI.


Ответы:


1

Чтобы использовать все возможности отладки Java Eclipse, вам необходимо запустить JVM с агентом JDWP, то есть передать следующий аргумент JVM:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9999

JDWP требует некоторых возможностей JVM TI, которые доступны только при запуске виртуальной машины. Это означает, что вы не сможете подключить отладчик позже, если JVM запущена без агента JDWP.

Я бы предложил установить аргумент командной строки или переменную среды, чтобы указать, что ваша программа на C ++ должна добавить указанный выше аргумент agentlib в vmArgs перед созданием JVM. После этого вы сможете подключить отладчик Java к порту, указанному в параметре address.

04.03.2017
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..