Определить, был ли файл .class скомпилирован с отладочной информацией? - PullRequest
38 голосов
/ 02 октября 2009

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

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

Ответы [ 2 ]

43 голосов
/ 02 октября 2009

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

2 голосов
/ 02 октября 2009

Вы должны проверить Code структуру в файле класса и найти атрибуты LineNumberTable и LocalVariableTable.

Инструменты, такие как ASM или Apache Commons BCEL (Библиотека разработки байт-кода), помогут: https://commons.apache.org/proper/commons-bcel/apidocs/index.html?org/apache/bcel/classfile/LineNumberTable.html

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