Как программно приостановить текущую JVM и дождаться подключения отладчика? - PullRequest
0 голосов
/ 09 февраля 2019

Моя цель - реализовать небольшую библиотеку на Java, которая позволила бы программно выполнять некоторые действия и затем приостанавливать текущую JVM до тех пор, пока к нему не будет подключен отладчик., напримерпри запуске JVM в режиме отладки с suspend=y он будет ожидать подключения отладчика.У кого-нибудь есть указатель на код, который реализует эту функцию?

Кажется, что JVMTI может позволить мне сделать что-то подобное программно, но мне интересно, есть ли API более высокого уровня или кто-то имеет кодпримеры / объяснения того, как взаимодействовать с JVMTI из Java (я предполагаю, что агент в JVMTI сможет приостановить JVM, но мне нужно вызвать его из кода Java).

Update : Вот что я нашел до сих пор.

1) Относительно просто вызвать код JVMTI из Java с помощью функции JNI, которая затем использовала бы jvmti env.Хитрость заключается в том, чтобы сохранить ссылку на jvmtienv во время загрузки агента.Это сообщение в блоге было очень полезным https://www.javacodegeeks.com/2014/12/own-your-heap-iterate-class-instances-with-jvmti.html.

2) Функциональность параметра приостановки, который можно передать JVM при запуске и ожидать подключения отладчика, прежде чем возобновить выполнение, не кажется чем-тоэто можно использовать повторно.Кажется, что это может быть просто агент отладчика, который прослушивает этот порт, и после установления соединения он просто продолжит выполнение / возобновление потоков.

3) Для API более высокого уровня, чтобы достичь того, что я хочу,кажется, что обычная thread.suspend () может делать то, что я хочу.Тогда возникает вопрос: чем он отличается от SuspendThread?Я открыл для этого другой вопрос: В чем разница между JVMTI SuspendThread и Javas thread.suspend? .

...