2
我使用asm來執行java函數中的字節碼檢測。 有沒有辦法做同樣的jre原生函數?也許一種方法來包裝本地函數與Java函數?本地java函數的字節碼檢測
我最終的目的是得到所有使用它們的參數運行的函數的列表。
我使用asm來執行java函數中的字節碼檢測。 有沒有辦法做同樣的jre原生函數?也許一種方法來包裝本地函數與Java函數?本地java函數的字節碼檢測
我最終的目的是得到所有使用它們的參數運行的函數的列表。
由於native
方法是在類文件中聲明的,所以可以像其他任何方法一樣替換它們。棘手的部分是如何調用原始方法。爲了實現這一點,您可以創建另一個native
方法,該方法將鏈接到原始代碼native
。
這必須在加載時發生,因爲大多數JVM不支持以後添加方法。有一個功能可以幫助將新幫手方法鏈接到原始代碼本地方法前綴。 documentation of Instrumentation.setNativeMethodPrefix
解釋詳細信息。
我來過這個問題,因爲我想包裝一些sun.misc.Unsafe本地方法。該類被加載得比較早,所以它不能用包裝的本地語言來初始定義。我把它帶到這裏:http://mail.openjdk.java.net/pipermail/serviceability-dev/2015-June/017495.html - 也許有人會有一個想法。 – eckes
@eckes:Instrumentation僅適用於JNI方法。一些JRE本地方法只是內在的,即JVM知道這些方法並在遇到時用內部操作替換它們的調用。因此,對於這種方法,檢測方法本身不起作用,但可以使用變換器將* invocations *替換爲其他代碼,而不是修改方法。 – Holger
同意,檢測工具可以用於JNI方法(通過用前綴版本包裝它們)。然而這對於已經加載的類是不可能的(因爲它們在重新定義它們時不允許添加方法)。至少我不知道如何。是的,它可能不適用於內部函數,但在我的情況下'Unsafe.allocateMemory()'不是一個內在的。 – eckes