簡體   English   中英

ASM字節碼替換功能未完成

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM