簡體   English   中英

Java調用棧檢查和操作

[英]Java call stack inspection and manipulation

我的問題是 :是否有可能(以任何方式)在運行時分析和修改調用堆棧(幀內容和堆棧內容)?

我正在尋找任何可能性 - 低級,不安全或內部API,編寫C擴展的可能性等。只有約束:它應該可以在標准運行時使用,無需調試或分析模式。 這就是我正在研究“它有可能嗎?”,而不是“這是好主意嗎?”。

我想從一個框架中收集所有本地數據,將其存儲在某個地方,然后從堆棧中刪除該框架,以后可以恢復它。 實際上,它為我們提供了JVM的延續,它們將允許快速異步框架(如來自python的gevents)和生成器結構(如來自python的那些)。

這可能看起來像重復的問題,但我只發現了使用“使用Thread.currentThread().getStackTrace() ”或“應該使用調試工具完成”的問題。 我有類似的問題 ,但它只是在詢問人們想要做什么(處理異步計算)的背景下回答,而我需要更一般的(面向Java堆棧)答案。 這個問題也是類似的,但和以前一樣,它專注於並行化,答案也集中於此。

我再說一遍:這是提出新語言功能提案的研究步驟。 我不想冒險破壞JVM中的任何東西 - 我正在尋找可能性,然后我將分析可能的風險並留意它們。 我知道手工操作堆棧是丑陋的,但是通過省略的consrtuctor創建實例也是如此 - 它是客觀化的基礎。 骯臟的黑客可能很臟,但它們可能有助於引入一些很酷的東西。

PS。 我知道QuasarLightwolf存在,但是,如上所述,那些是以並發為中心的框架。

編輯

澄清一點:我正在尋找與未來JVM和庫版本兼容的東西。 我們最好談論一些被認為是穩定的公共API的東西,但如果解決方案存在於內部,但幾乎是標准的,或者在內部(如sun.misc.Unsafe)之后成為標准的東西 - 那也會做。 如果C-extension只使用C JVM API可行 - 那沒關系。 如果這對於字節碼操作是可行的 - 那也沒關系(我認為可以使用ASM)。

我認為有一種方法可以使用JVMTI實現您的目標。

雖然您不能直接執行您想要的操作(如上面的注釋中所述),但您可以在運行時檢測/重新定義方法(或整個類)。 因此,您可以定義每個方法直接調用另一個方法來“恢復執行上下文”,只要您擁有所需的堆棧,就可以使用原始代碼重新定義它們。

例如:假設您想要恢復一個堆棧,其中只有A被稱為B和B被稱為C.當A被加載時,更改代碼直接調用B.加載B后,重新定義它直接調用C; 調用最頂層的方法(A); 一旦C被調用(現在應該非常快),將A和B重新定義為原始代碼。

如果涉及多個線程且必須恢復的參數值,它會變得更復雜,但仍然可以使用JVMTI。 然而,這將是值得另一個問題;-)。

希望這可以幫助。 如果您需要澄清任何內容,請隨時與我聯系或發表評論。

編輯:雖然我認為它是可行的,但我也認為這是很多(!!!)工作,特別是當你想恢復參數,局部變量和調用上下文(如這個指針,持有鎖,...) 。

按要求編輯:假設與上面相同的堆棧(呼叫B呼叫C)。 雖然A,B和C里面有任意代碼,但只需將它們重新定義為:

void A(){B(); } void B(){C(); } void C(){redefine(); }

一旦到達redefine方法,請使用原始代碼重新定義所有類。 然后你有你想要的堆棧。

在此工具中不確定,但您可以查看http://en.wikipedia.org/wiki/GNU_Debugger

GDB提供了廣泛的工具來跟蹤和改變計算機程序的執行。 用戶可以監視和修改程序內部變量的值,甚至可以獨立於程序的正常行為調用函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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