Подтвердить что ты не робот

Определите, был ли скомпилирован файл .class с информацией об отладке?

Как я могу определить для любого файла Java.class, если он был скомпилирован с информацией об отладке или нет?

Как я могу точно сказать, что используется опция -g {source | lines | vars}?

4b9b3361

Ответ 1

Если вы находитесь в командной строке, тогда 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 вместо того, чтобы писать еще один считыватель байт-кода.

Ответ 3

Я сам столкнулся с этой проблемой и создал Perl script частично на основе ответа Пита, в котором показано, как использовать javap для поиска отладочной информации. script распространяется на это, автоматизируя процесс чтения через JAR и проверяя отладочную информацию на каждом классе внутри и сообщая о каких-либо сломанных классах, в которых отсутствует информация для отладки:

https://gist.github.com/megahall/5416632

Надеюсь, это поможет следующему человеку, который сталкивается с теми же проблемами.