2008-11-07 3 views
32

Иногда, когда я отлаживаю код в Eclipse, бывает, что хотя я могу без труда просматривать и проверять переменные-члены класса, я не могу проверить значения переменных, объявленных локально внутри функций. В стороне любые параметры текущей функции теряют свои «настоящие» имена, и вместо этого они видят свои значения, перечисленные в окне «Переменные», как arg0, arg1, arg2 и т. Д., Но, по крайней мере, значения видны.Локально объявленные переменные не могут быть проверены

В настоящее время это происходит в отношении классов, определенных в базовом JDK. Я проверил, что установленная и текущая JRE - это JDK.

Неужели кто-нибудь может пролить свет на это поведение?

+1

У меня была такая же проблема. Кажется, что `ctrl + Shift + I` на выбранной локальной переменной показывает значение. – blackSmith 2014-10-17 07:42:31

+0

Если нет отладочной информации о локальных переменных (см. Ответы ниже и [Определите, был ли скомпилирован файл .class с информацией об отладке?] (Https://stackoverflow.com/q/1508235/1078886)), этот ярлык не помогает либо, Eclipse покажет, что «_variable_ не может быть разрешено переменной». – 2017-06-03 20:41:25

ответ

23

Видимо, answer является:

rt.jar, который поставляется с JDK (где живут основные Java-классы) не компилируется с полной отладочной информацией, включенной в файлы .class, так что отладчик не содержит локальных переменных.

К сожалению, это не то, о чем Eclipse может что-либо сделать - все отладчики будут иметь одинаковую проблему с основными классами JDK.

В release notes of Eclipse 3.4 состоянии:

Отсутствующих отлаживать атрибуты
отладчик требует, чтобы файлы классы составляться с отладкой атрибутов, если он должен быть в состоянии отображать номера строк и локальные переменные. Довольно часто библиотеки классов (например, «rt.jar») компилируются без полных атрибутов отладки, и поэтому локальные переменные и аргументы метода для этих классов не отображаются в отладчике.

+2

Действительно хорошая вещь была бы, если бы JDK имел отладочную информацию, активную в своей частной JRE! – 2009-06-02 20:17:08

9

Это used to be, что вы можете получить отладки rt.jar от HTTP: //download.java.net/jdk6/binaries/, но не больше.

Таким образом, building your own rt.jar with -g представляется единственным вариантом. Это очень просто: просто используйте javac и jar из своего JDK.

  • mkdir \tmp; mkdir \tmp\out
  • Извлечение src.zip в каталоге установки JDK для tmp\src
  • cd src
  • find -name *.java > files.txt
  • javac -verbose -g -d \tmp\out -J-Xmx512m -cp "<jdk>\jre\lib\rt.jar";"<jdk>\lib\tools.jar" @files.txt
  • cd \tmp\out; jar cvf rt.jar *

Если вы используете Eclipse, вам не нужен -Xbootclasspath/p :, вместо этого просто помещайте банку отладки в Bootstrap Entries перед JRE в конфигурации запуска.

+3

Я пытался скомпилировать источники из `src.zip` в openjdk` jdk7u40-b43` с помощью этих инструкций, однако javac по какой-то причине не видит некоторые классы из rt.jar, прикрепленного журнала на https://dl.dropboxusercontent.com /u/14767221/compile.log – 2013-09-24 13:39:01

0

Я попробовал ссылку (http://www.javaadvent.com/2014/12/recompiling-java-runtime-library-with.html), загрузил муравейник и модифицировал его.Модификация: прошло <compilerarg line="-g" /> в javac. Он сгенерировал rt.jar. Заменен rt.jar JRE. (Не забудьте сохранить резервную копию).

Теперь я могу наблюдать, проверяя локальные переменные любого класса в rt.jar во время отладки в eclipse.

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