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...