JDB - Как получить список методов перед запуском программы? - PullRequest
7 голосов
/ 18 июля 2010

Я изучаю JDB и сталкиваюсь с небольшим парадоксом. После запуска JDB (с "jdb ClassName") большинство уроков скажут мне набрать

> методы ClassName

чтобы увидеть список доступных методов, чтобы я мог установить свои контрольные точки. Если я это сделаю, JDB отвечает

Команда 'method' недействительна, пока виртуальная машина не запущена с командой 'run'

Конечно, если я скажу «запустить» перед установкой каких-либо точек останова, он будет проходить напрямую; не очень полезно Единственное, что я могу сделать вывод, это то, что jdb ожидает, что вы установите слепые точки останова, но это кажется таким грубым упущением, что я просто пропускаю команду.

Большое спасибо !! Джойс

Ответы [ 3 ]

1 голос
/ 04 февраля 2015

Обратите внимание, что существует два способа создания сеанса отладки (см. Документацию jdb ).

  1. Присоединение -Мы загружаем программу в виртуальную машину, она приостанавливает прослушивание порта (например, 8000).Затем в другом терминальном сеансе мы загружаем jdb и присоединяем его к сеансу JVM, указав порт.
    • в одном терминальном сеансе: java -Xdebug -agentlib:jdwp=transport=dt_socket, address=8000,server=y,suspend=y ClassName
    • во втором терминальном сеансе:jdb -attach 8000
  2. Запуск - Загрузить jdb и сообщить имя класса для загрузки.
    • в одном терминальном сеансе: jdb ClassName

Если вы присоединяете , вам не нужно использоватьКоманда run.
Однако, если вы запускаете , тогда вам do необходимо использовать команду run (виртуальная машина еще не запущена).


Это поведение может быть выведено из man jdb:

run - После запуска jdb и установки любых необходимых точек останова используйте этукоманда для запуска выполнения отлаженного приложения. Эта команда доступна только тогда, когда jdb запускает отлаженное приложение (в отличие от подключения к существующей виртуальной машине) .

Вот почему у вас появляется сообщение об ошибке.Вы запустили отладчик, но не использовали run command.Некоторые учебные пособия могут неправильно указывать вам launch jdb, но не забудьте сказать вам, что нужно выполнить команду run.


Ниже показано, как получить список методов (при условии, что выиметь main метод в классе ClassName).

  1. Присоединение :
    jdb -attach 8000
    main[1] stop in ClassName.main
    main[1] cont
    main[1] methods ClassName

  2. Запуск :
    jdb ClassName
    > stop in ClassName.main
    > run
    main[1] methods ClassName

Подсказка : посмотрите командную строку jdb.Иногда это >, иногда это main[1].Если это >, то виртуальная машина не запустилась и такие команды, как classes, methods не будут работать, пока вы не воспользуетесь командой run.Если приглашение main[1], виртуальная машина была запущена, и нужные команды будут работать.


Единственное, что я могу сделать вывод, это то, что jdb ожидает, что вы установите слепые точки останова

Трудно установить точки прерывания, используя только отладчик.Вы должны смотреть на свой исходный код в другом месте.Скорее всего, вы будете знать имя хотя бы одного метода, на который нужно порвать, и, таким образом, установите начальную точку останова, используя stop in ClassName.MethodName.Если вы не знаете, где выполнить разрыв, вы всегда можете установить точку останова для основного метода, используя stop in ClassName.Main.Помните, что во время работы отладчика вы можете установить больше точек останова.Также, вы можете найти полезной команду list - она ​​показывает исходный код, соответствующий текущему достижению точки останова.

1 голос
/ 18 июля 2010

Если вы отлаживаете свою собственную программу, я думаю, вы знаете имена классов!

Если это программа, для которой у вас нет исходного кода, то для ее запуска необходимо знать имя класса, содержащее main(). Если он находится в банке, начинающейся с java -jar, имя этого класса находится в манифесте внутри банки.

Но на самом деле вы используете jdb ClassName, так что вы знаете, вы будете использовать метод ClassName.main(). Правильно?

Если это сервлет в веб-сервисе, класс сервлета находится в web.xml.

Так что в любом из этих случаев вы, по крайней мере, сможете получить самый первый метод. Оказавшись там, вы можете найти остальные.

0 голосов
/ 09 октября 2013

У меня был точно такой же вопрос.

Итак, после запуска:

jdb -classpath build -sourcepath src MyClass

введенный текст выделен жирным шрифтом ниже в сеансе jdb:

> <b>stop in MyClass.main</b>
Deferring breakpoint MyClass.main.
It will be set after the class is loaded.
> <b>run</b>
run MyClass
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
> 
VM Started: Set deferred breakpoint MyClass.main

Breakpoint hit: "thread=main", MyClass.main(), line=798 bci=0
798         MyClass singleton = new MyClass();

main[1] <b>list</b>
797     public static void main(String[] args) {
798 =>      MyClass singleton = new MyClass();
799         
...