2009-06-22 98 views
16

有沒有辦法在java中輸出特定線程的調用跟蹤?在java中調用跟蹤

我不想要堆棧跟蹤。我想要在每個對象上進行一系列調用以進行跟蹤。

回答

2

Runtime.traceMethodCalls(),打印一行在所有線程中的所有對象的每個方法調用

+0

Sun的HotSpot對窗口VM獲得似乎沒有輸出跟蹤方法調用。我讀過我需要用'java_g'運行java調試。有任何想法嗎? – JavaRocky 2009-06-23 01:40:54

+0

是的,對我來說``Runtime.getRuntime()。traceMethodCalls(true);`什麼都不做。我是否需要將參數傳遞給`javac`或`java`? – 2009-12-26 17:35:44

+0

仍然不是java版「1.8.0_111」 – 2017-12-14 19:14:47

2

你會基本上要某種形式,這裏的方面可以判斷當前線程是否本來是面向方面編程記錄呼叫。 (另一種方法是明確地將日誌記錄放在每個方法中,這會很痛苦。)

Java中有很多AOP框架,如AspectJSpring(當然,Spring比AOP要多得多)。

應用方面系統中的每個方法調用可能會非常棘手,但...我沒有使用AspectJ任何經驗,但Spring AOP的基本目的是使AOP周圍的部件。 Spring不能輕易改變Spring所未知的類。請注意,自從我使用Spring AOP以來,這已經有一段時間了 - 以後可能會出現以下情況:)

2

我們可以創建一個新的Throwable對象,該對象具有調用跟蹤。使用一些字符串操作,我們可以獲得調用堆棧。

Throwable t = new Throwable(); 
System.out.println(t.getStackTrace()[1].toString()); 

我不確定如何以這種方式檢索信息,這是一種很好的做法。 :)

13

我想你可能會覺得這很有趣。它是一個java代理,它將入口和出口日誌記錄添加到方法中,使用slf4j框架實際記錄輸出。然後是配置日誌框架只打印出線程你有興趣的事

http://www.slf4j.org/extensions.html#javaagent

(只是要明確:1)。我寫的,2)它爲我工作:) )

3

如果您想跟蹤Java代碼的執行情況,您可以使用名爲InTrace的工具。

注意:InTrace是我寫的一個免費的開源工具。