BTrace二三事之四 unsafe指令碼需要注意的

2021-08-27 10:06:08 字數 2246 閱讀 7810

unsafe指令碼怎樣才是安全的??除了指令碼對已有物件應該限於唯讀操作,

並且不應該持有物件的引用外,暫時所能想到的,先列幾條吧:

1、啟用unsafe模式:

修改btrace啟動引數 -dcom.sun.btrace.unsafe=true

btrace指令碼註解:@btrace(unsafe = true)

2、btrace指令碼類的classloader為引導類載入器;

被跟蹤的類的載入器仍為原類載入器不變;

agent在載入指令碼類之前會對指令碼類進行修改,

包括修改指令碼方法名稱、@tls變數修改為threadlocal等;

3、btrace指令碼編譯後,@onmethod、@onerror等註解的方法,

將被新增到目標類中。而指令碼中的公共呼叫方法,仍保留在指令碼中。

所以,被註解的方法中可以引用目標類載入器可見的型別;

但指令碼的公共呼叫方法中,只能引用引導類載入器可見的型別,

否則執行期報noclassdeffounderror

4、進入方法為location = @location(kind.enter)

退出方法的途徑有2個:

正常退出:location = @location(kind.return)

異常退出:location = @location(kind.error)

5、可以用-dcom.sun.btrace.dumpclasses=true

-dcom.sun.btrace.dumpdir=./yourdumpdir方式將修改後的類轉儲,

借助反編譯工具檢視增強後的**;

6、btrace1.2.2版本的bug:

@onmethod(clazz = "+my.command", method = "execute")

如果agent附加到目標程序時,已經載入過「+」對應的子類,

那麼只有已載入的子類會被修改,之後載入的子類不會被指令碼**所修改;

@btrace(unsafe = true)

public class samplescript

@onmethod(clazz = "/my\\..*?command/", method = "execute", location = @location(kind.return), type = "void(my.fooparam)")

public static void onexecutereturn(@probeclassname

string classname)

@onmethod(clazz = "/my\\..*?command/", method = "execute", location = @location(kind.error), type = "void(my.fooparam)")

public static void onexecuteerror(@probeclassname

string classname, throwable e)

public static void test()

}

public class btracestarter 

system.setproperty("com.sun.btrace.probedescpath", ".");

system.setproperty("com.sun.btrace.dumpclasses", "true");

system.setproperty("com.sun.btrace.dumpdir", "./dump");

system.setproperty("com.sun.btrace.debug", "false");

system.setproperty("com.sun.btrace.unsafe", "true");

bufferedreader in = new bufferedreader(new inputstreamreader(system.in));

system.out.println("請輸入目標程序pid: ");

string pid = in.readline();

string script = new file(btracestarter.class.getresource("samplescript.class").getfile()).getcanonicalpath();

com.sun.btrace.client.main.main(new string );}}

碼農脫髮二三事(四)

今天繼續寫 關於脫髮丟失愛情的事情,我身邊倒是不少例子,之前也寫了幾個,今天想聊點兒高興的。李哥是我們公司的技術總監,非典型程式設計師,性格活得很,除了 寫得好,產品思路 運營思路甚至連公關都做得。我們經常開玩笑說你不自己當老闆真是可惜了。他說寫 多好玩啊,寫得了 還不脫髮,他是老天爺賞飯吃的人兒,...

QT Embedded二三事之FAQ

1.如何管理從堆中new出的qobject物件?如何安全delete才能避免記憶體洩露?16.qt embedded的執行緒能建立並使用widget?qt embedded的執行緒應該都看做是work thread,盡量只做與ui無關的事情,不要直接操作widget,給widget發訊息呼叫qthr...

簡事二三 之 http快取機制

請求頭 瀏覽器向伺服器傳送請求的資料,資源 響應頭 伺服器向瀏覽器相應資料,告訴瀏覽器我是誰,我要怎麼做。如,我是nginx,給你的資源是正確的200 還是錯誤的404,我告訴你需要快取多久。快取優先順序 pragma cache control expires etag last modified...