2010-05-26 2 views
2

Есть ли способ просмотра элементов стека, таких как не назначенные значения возврата или исключения, которые не назначены локальной переменной? (Например, бросить новый ...)Отладка данных стека, не назначенных именованной переменной

Например, предположим, что у меня есть код вдоль линий:

public String foo(InputStream in) throws IOException {  
    NastyObj obj = null; 
    try { 
     obj = new NastyObj(in); 
     return (obj.read()); 
    } finally { 
     if (obj != null) obj.close(); 
    } 
} 

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

Обычно я использую среду отладки Eclipse, но любой ответ оценивается. Кроме того, если это невозможно сделать, можете ли вы объяснить, почему? (JVM, ограничение JPDA?)

+0

Вы имеете в виду что-то вроде этого: http://stackoverflow.com/questions/1069066/get-current-stack-trace-in-java/1069074#1069074 – jjnguy

+0

Мысли то же самое более одного раза. Eclipse не может, AFAIK. –

+0

@ Justin Nelson - Нет. Цель состоит в том, чтобы просмотреть исключение или вернуть значение в отладчике. например если бы я был остановлен в точке останова в блоке finally. Получение трассировки стека покажет мне путь вызова в foo, а не результат. – gibbss

ответ

1

Ответ, похоже, недостаточен как для JPDA/JDI, так и для Eclipse. Я проверил следующее, но я не собираюсь писать код, если кому-то это не нужно.

По большей части JDI отражает структуру кода. Именованные локали для данной области могут быть получены через текущий поток потока debuggee StackFrame. Недоступные локальные значения и аргументы метода могут быть получены через текущий поток потока debuggee Method. Однако, в общем случае, когда документация относится к LocalVariable, она является именованной локалью.

Возможно получить возвращаемое значение функции, если функция возвращается нормально, и вы используете установку отладки 1.6 (RFE). Если отладчик прослушивает MethodExitEvent, то event.returnValue() получает значение, возвращаемое после завершения всего метода. Согласно документации, это событие НЕ генерируется, когда метод завершается с помощью заброшенного исключения.

Вывод: если вы используете JDI непосредственно под Java 1.6, вы можете получить возвращаемое значение функции до того, как оно назначено локальному, если оно возвращается нормально. Интерфейсы Eclipse и Netbeans не поддерживают это. Вы не можете получить информацию об исключениях, которые были выброшены, но еще не пойманы.

0

Не могли бы вы просто поймать IOException (и назвать его), а затем перебросить? (Не знаю Java, но это то, что я сделал бы на C++ и Python.) Конечно, этот ответ недействителен, если вы не можете отредактировать данный код или сейчас проверяете состояние и должны знать, что это похоже ... Но если вы можете отредактируйте код, который выглядит как способ пойти.

+0

Спасибо, но нет, я не хочу редактировать код. Обычно, когда это проблема, я отлаживаю сторонний код и не хочу углубляться (или перекомпилировать) NastyObj, потому что это противно. – gibbss

Смежные вопросы