Сеанс удаленной отладки JVM завершается по необработанному исключению - PullRequest
6 голосов
/ 17 мая 2011

Я пытаюсь отладить проект Scala удаленно. И исполняемая программа (созданная и выполняемая из SBT), и мой отладчик (Intellij) являются локальными, но, поскольку я не хочу строить с использованием Intellij, использование сеанса удаленной отладки представляется самым простым вариантом для удобной отладки.

Программа запускается со следующими параметрами:

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005

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

Консоль Intellij читает:

Connected to the target VM, address: 'localhost:5005', transport: 'socket'
Disconnected from the target VM, address: 'localhost:5005', transport: 'socket'

Есть ли что-то, чего я упускаю на стороне выполнения или отладки?

Редактирование: добавление трассировки стека, в которую я добавляю новое исключение («что») в основную часть моего класса:

[error] java.lang.Exception: what
[error]     at travellr.application.prophet.Prophet$.main(Prophet.scala:80)
[error]     at travellr.application.prophet.Prophet.main(Prophet.scala)
[error]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[error]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
[error]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
[error]     at java.lang.reflect.Method.invoke(Method.java:597)
[error]     at scala.tools.nsc.util.ScalaClassLoader$$anonfun$run$1.apply(ScalaClassLoader.scala:81)
[error]     at scala.tools.nsc.util.ScalaClassLoader$class.asContext(ScalaClassLoader.scala:24)
[error]     at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.asContext(ScalaClassLoader.scala:86)
[error]     at scala.tools.nsc.util.ScalaClassLoader$class.run(ScalaClassLoader.scala:81)
[error]     at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.run(ScalaClassLoader.scala:86)
[error]     at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:83)
[error]     at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)

Ответы [ 2 ]

8 голосов
/ 18 мая 2011

Если исключение никогда не перехватывается, это приведет к закрытию приложения и завершению JVM, что, очевидно, завершает сеанс отладки.

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

Обратите внимание, что и SBT (если вы не разветвляете отдельную виртуальную машину), и бегун Scala (есливы разветвляетесь) ловите все исключения, добавленные в код клиента.Следовательно, не будет «неисследованных исключений», и вам нужно будет приостановить действие «пойманных исключений».

1 голос
/ 19 мая 2011

Прежде чем я начну, я не кодировал ни одного scala, но это может помочь вам поймать необработанные исключения в java, см. Метод Thread.UncaughtExceptionHandler

Когда поток очтобы завершиться из-за неперехваченного исключения, виртуальная машина Java запросит поток для своего UncaughtExceptionHandler, используя Thread.getUncaughtExceptionHandler (), и вызовет метод обработчика uncaughtException, передав поток и исключение в качестве аргументов.Если потоку не был явно установлен UncaughtExceptionHandler, то его объект ThreadGroup действует как его UncaughtExceptionHandler.Если у объекта ThreadGroup нет особых требований для работы с исключением, он может переслать вызов обработчику необработанных исключений по умолчанию.

Я полагаю, вы можете зарегистрировать исключение, и это может дать вам представление оэта проблема.

РЕДАКТИРОВАТЬ: Это также предполагает, что вы можете повторно развернуть новый проект, который может быть не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...