Eclipse - отображение полного стека вызовов (например, когда он достигает точки останова в отладчике) без установки точек останова? - PullRequest
14 голосов
/ 15 июля 2011

Я работаю с устаревшим Java-приложением, которое является новым для меня, поэтому я подумал, что один из способов выяснить, как он работает, и что-то упростить, - получить полную трассировку стека после выполнения действий,чтобы видеть, какие классы используются, основываясь на конкретном действии пользовательского интерфейса.Я думал, что это возможно в отладчике, но кажется, что это работает, только если я вставляю точку останова, и в этом случае одной из целей этого является то, что мне не нужно знать, что вызывается, чтобы иметь возможность вставитьСначала остановите точку (поскольку это поможет мне это сказать).

Я прошу прощения, если это основной вопрос, я искал по этому вопросу, но не нашел правильного ответа.

Ответы [ 6 ]

3 голосов
/ 16 июля 2011

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

"BTrace - безопасный, динамический инструмент трассировки для Java. BTrace работает с помощью динамически (байт-кода) инструментальных классоввыполнение Java-программы. BTrace вставляет трассирующие действия в классы работающей Java-программы и выполняет горячую замену отслеживаемых программных классов. "

2 голосов
/ 15 июля 2011

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

1 голос
/ 16 июля 2011

Несколько предложений:

Некоторые профилировщики позволяют вам переходить от любого конкретного метода вверх (а иногда и вниз), чтобы увидеть, что вызывается и вызывается. Я нашел эту удивительную информацию о потоке даже в приложениях, которые, как мне казалось, я хорошо знал.

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

Обратное проектирование больших унаследованных приложений - это то место, где я использую UML довольно регулярно. В моей голове слишком много всего, чтобы составить хорошую общую картину. Если у вас есть инструмент UML, который будет выполнять реверс-инжиниринг, загрузите его вместе с приложением, а затем, вероятно, сильно сократите классы, которые вам не нужны, потому что они тривиальны или очевидны. Расставьте диаграммы так, чтобы вы могли их понять. Таким образом я использовал «Вместе», «Волшебное рисование» и «Визуальную парадигму». Вместе работали лучше всего - но это было десять лет назад.

1 голос
/ 16 июля 2011

Другой трюк, который вы можете использовать, - выяснить, какие классы, которые вы знаете, должны быть включены в путь кода, который вы пытаетесь перехватить.Например, вы упомянули, что это веб-приложение Java EE, и, следовательно, действие, вероятно, является своего рода взаимодействием сервлета (на некотором уровне).У меня нет API передо мной, но вы можете поместить точку останова на метод в объекте ответа, где получен выходной поток.Когда это произойдет, вы узнаете код, который пытается обслужить запрос.

1 голос
/ 15 июля 2011

Вы всегда можете запустить приложение с аргументом виртуальной машины -verbose: class. Затем вы можете посмотреть вывод консоли и посмотреть, какие классы загружается виртуальной машиной при выполнении определенного действия. Это может дать вам отправную точку для размещения точек останова. Это не всегда работает в зависимости от сценария, но может быть полезным.

0 голосов
/ 15 июля 2011

Вы всегда можете увидеть, где вызывается метод, нажав «Открыть иерархию вызовов» из затмения (щелчок левой кнопкой мыши по выбранному методу или сочетание клавиш CTRL + ALT + H) Кроме того, вы всегда можете проверить, где определен метод / класс, нажав «Открыть объявление» (щелкните левой кнопкой мыши на выбранном методе / классе или F3).

...