2015-07-06 2 views
0

Можно ли отлаживать запущенный Java-процесс (с Eclipse/IntelliJ) без наличия точки останова? Было бы полезно, чтобы получить состояние объекта, когда имеющий конструкцию, как это:Отладка Java без точки останова

double d = Math.random(); 
BlockingQueue<String> queue = new LinkedBlockingQueue<String>(); 
queue.take(); 

«взять()» будет блокировать навсегда, и я хотел бы получить значение г с отладчиком после взлета () назывался.

+0

У меня что-то не хватает в вопросе .. вы хотите знать значение d без точки останова; Я не уверен, почему вы хотите избежать точки останова, поскольку точка останова на линии 2 или 3 даст вам значение d. Поэтому я не могу сказать, хватит ли System.out? –

+0

@ChrisK Когда я запускаю большое серверное приложение и хочу узнать, что случилось, если он не работает, я не могу установить точку останова после этого. Мне пришлось бы либо делать дамп памяти (который стоит времени для анализа и прочее), либо, если возможно, просто присоединить отладчик к потоку. –

ответ

0

Только что заметил, что в Eclipse и IntelliJ есть кнопка паузы/приостановки. Это делает работу.

1

I'd like to get the value of d with the debugger after take() was called

Простым решением было бы напечатать значение. Тогда вам совсем не нужен отладчик. Отладчик полезно при изменении данных из-за тестирование что-то, осматривая определенные объекты во время выполнения и т.д.

queue.take(); 
System.out.println(d); 
+1

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

+0

Проблема в том, что: take() - это блокирующий вызов, jvm никогда не дойдет до печати на консоли. –

0

В вашем случае это не вариант. Один из вариантов, который вы можете использовать, состоит в том, чтобы декомпилировать банку, содержащую класс BlockingQueue, преобразовать их в исходные файлы, включить его в свой проект и установить контрольные точки внутри take(), чтобы увидеть поведение.

Один лучший декомпилятором является:

http://jd.benow.ca/

помощью этого вы можете увидеть источник take() функции и скопировать весь класс и вставить его в пакете с именем BlockingQueue.java и вставить весь источник и отладки, как вы хотите.

+0

Хм, BlockingQueue был просто примером.Может также быть Object.wait(). Я просто хочу подключиться к спящему (или запущенному) потоку, независимо от того, где сейчас находится поток. –

+0

@ CalibeR.50 Вы также можете найти код для Object.wait(). Но имейте в виду, что этот класс, 'Object', импортирован в исходный файл по умолчанию. Вы можете создать реплику класса Object с другим именем и наследовать свой класс от него и использовать его по своему усмотрению. –

+0

Я не хочу знать, что происходит внутри реализации, я просто хочу приостановить поток без точки останова. Я ответил на вопрос ниже. –

0

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

  1. журнал вашей системы и сохраняйте всю обработку идемпотентной и детерминированной.
  2. приложить отладчик после ошибки; вы не сможете вернуться к точке исключения, но вы сможете проверить текущее состояние системы.
  3. добавьте на свой сервер, который вы можете подключить telnet и проверить систему с помощью
  4. Изучите решения DVR для Java, такие как http://chrononsystems.com. Они позволяют откатить систему до точки исключения.
Смежные вопросы