2017-02-10 9 views
1

Есть ли способ получить номера строк (как в java-файле) из смещения метки?ASM Bytecode - Получить номера строк из смещения метки

@Override 
    public void visitLabel(Label label){ 
    super.visitLabel(label); 
    mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", 
     "Ljava/io/PrintStream;"); 
    mv.visitLdcInsn("line " + label.getOffset() + " executed"); 
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", 
     "(Ljava/lang/String;)V", false); 
    } 

Я перезаписаны метод visitLabel в MethodVisitor, чтобы напечатать lebel.getOffset при посещении каждой метки. Я получаю целочисленные значения, но они не такие же, как номера строк в java-файле.

+0

Они должны быть в противном случае отладки не будут работать (для чего они используются) –

+0

Можете ли вы предложить, как извлечь номер строки из смещения метки? TIA – maddie

+0

должен быть номер строки, если вы скомпилировали его с информацией об отладке. –

ответ

0

Вам нужно будет создать настраиваемое сопоставление. Каждый номер строки посещается со ссылкой на метку, и каждый ярлык посещается в порядке их появления. Вам необходимо будет:

  1. Помните каждую метку, которая ссылается на номер строки.
  2. Проверьте, не был ли какой-либо ярлык, какой номер строки был последним, предшествующим посещаемой метке.
+2

К сожалению, все не так просто. ASM может создавать несколько меток для одного кодового местоположения, а номер строки не применяется для посещения перед всеми другими метками той же позиции. Таким образом, самый последний посещенный номер строки может быть устаревшим, по сравнению с тем, который можно было бы посетить сразу после 'visitLabel'. Поскольку вы не можете заранее знать, будет ли вызов 'visitLineNumber' следовать сразу после вашего текущего' visitLabel', я не вижу решения с одним проходом ... – Holger