Как я могу определить для любого файла Java.class, если он был скомпилирован с информацией об отладке или нет?
Как я могу точно сказать, что используется опция -g {source | lines | vars}?
Как я могу определить для любого файла Java.class, если он был скомпилирован с информацией об отладке или нет?
Как я могу точно сказать, что используется опция -g {source | lines | vars}?
Если вы находитесь в командной строке, тогда javap -l отобразит LineNumberTable и LocalVariableTable, если они есть:
peregrino:$ javac -d bin -g:none src/Relation.java
peregrino:$ javap -classpath bin -l Relation
public class Relation extends java.lang.Object{
public Relation();
peregrino:$ javac -d bin -g:lines src/Relation.java
peregrino:$ javap -classpath bin -l Relation
public class Relation extends java.lang.Object{
public Relation();
LineNumberTable:
line 1: 0
line 33: 4
peregrino:$ javac -d bin -g:vars src/Relation.java
peregrino:$ javap -classpath bin -l Relation
public class Relation extends java.lang.Object{
public Relation();
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this LRelation;
javap -c
отобразит исходный файл, если он присутствует в начале декомпиляции:
peregrino:$ javac -d bin -g:none src/Relation.java
peregrino:$ javap -classpath bin -l -c Relation | head
public class Relation extends java.lang.Object{
...
peregrino:$ javac -d bin -g:source src/Relation.java
peregrino:$ javap -classpath bin -l -c Relation | head
Compiled from "Relation.java"
public class Relation extends java.lang.Object{
...
Программно, я бы посмотрел ASM вместо того, чтобы писать еще один считыватель байт-кода.
Вы должны проверить Code
структуру в файле класса и искать LineNumberTable
и LocalVariableTable
.
Инструменты, такие как ASM или Apache Commons BCEL (Библиотека байтовой кодировки) помогут: https://commons.apache.org/proper/commons-bcel/apidocs/index.html?org/apache/bcel/classfile/LineNumberTable.html
Я сам столкнулся с этой проблемой и создал Perl script частично на основе ответа Пита, в котором показано, как использовать javap для поиска отладочной информации. script распространяется на это, автоматизируя процесс чтения через JAR и проверяя отладочную информацию на каждом классе внутри и сообщая о каких-либо сломанных классах, в которых отсутствует информация для отладки:
https://gist.github.com/megahall/5416632
Надеюсь, это поможет следующему человеку, который сталкивается с теми же проблемами.