[英]ASM Bytecode replacement function not completing
我有一個稍微復雜的架構,我試圖使用JVMTI函數RetransformClasses和事件掛鈎ClassLoadFileHook來檢測類 ,同時使用JNI進行Java空間來執行轉換。 在ClassLoadFileHook
,我檢查它是否為我想要檢測的類被觸發,如果是,我對Java類進行JNI調用,在那里我使用ASM 5.0.4執行檢測。 也就是說,在Java空間中,我得到一個表示已檢測類的字節數組,然后回調到我的本機代碼以應用更新。
我遇到的問題是,在我重新編寫類的Java代碼中,代碼在實例化ClassReader
期間/之后掛起:
/**
* Transform some class and then call back down to native code to apply
* the transformation.
*
* @param existingClass The existing class to change.
*/
public synchronized void transformSomeClass(byte[] existingClass) {
System.out.println("Transformation function started. Existing class len: " + existingClass.length);
try {
ClassReader cr = new ClassReader(existingClass);
// No statements below here are being executed.
// I'm also not sure if `new ClassReader` is being successfully
// executed.
System.out.println("After ClassReader instantiation");
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
System.out.println("After ClassWriter instantiation");
ClassVisitor cv =
new MyCustomClassAdapter(cw, this.lineNumberToPlaceUpdate_);
System.out.println("After ClassVisitor instantiation");
cr.accept(cv, 0);
System.out.println("After cv accept.");
System.out.println("Applying class transformation natively.");
// Call back down to native code to apply the update in ClassLoadFileHook.
applyClassTransformNative(cw.toByteArray());
System.out.println("Transformation function ended.");
} catch (Exception e) {
// This is never being fired.
System.err.println("Class transformation could not be completed. Error message: " + e.getMessage());
e.printStackTrace();
} finally {
// This print statement is never executed.
System.err.println("Going back to native code from finally");
}
}
正如我在代碼的注釋中提到的那樣,在執行ClassReader
intantiation語句之后沒有任何內容。 甚至finally
塊也不會被執行。 我不確定這里會發生什么 - 為什么實例化一個采用通用字節數組的ClassReader
會導致代碼像這樣掛起? 我實際上沒有在課上進行過任何操作。
如果調用Java代碼導致類加載,則隱式地在加載類的類加載器上進行同步。 我假設您在本機層上觸發了這樣的類加載,然后在嘗試在Java層上再次觸發它時被阻止。 這就是為什么當你嘗試用Java轉換類時,你永遠不會超越第一個ASM類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.