2011-07-15 52 views
13

我正在使用一種對我而言是新手的遺留Java應用程序,以便找出它是如何工作並找到更容易的方法,我認爲在執行操作後能夠獲得完整的堆棧跟蹤,所以以便能夠根據特定的UI動作查看正在使用哪些類。我曾認爲這在調試器中是可能的,但它似乎只在我插入一個斷點時才起作用,並且在這種情況下,這樣做的目的之一就是爲了不必知道被調用什麼能夠插入首先是斷點(因爲這有助於告訴我這一點)。Eclipse - 顯示完整的調用堆棧(就像它在調試器中點擊斷點時一樣)而不會放入斷點?

我很抱歉,如果這是一個基本的問題,我已經在這個搜索,但我沒有找到正確的答案。

+0

不會通過日誌文件更容易作爲起點 –

+1

哪些日誌文件?該應用程序使用tomcat服務器,我不認爲它會記錄每個方法調用它,這是自動記錄在其他地方,我失蹤(某種日食日誌?)謝謝 – Rick

+0

不,我指的是應用程序只有日誌(我不知道通過eclipse或tomcat進行的自動日誌記錄)。所以,如果你幸運的話,遺留代碼會有一定程度的記錄。將日誌級別設置爲最低並運行UI。 –

回答

3

這並不直接回答你的問題,但也許它會更好地解決你的問題。看看BTrace。它可以讓你測試一個正在運行的Java應用程序並插入你自己的一些基本代碼。例如,你可以寫出整個方法調用鏈來幫助你找到通過應用程序的方式。它有點類似於AspectJ,但是具有完全不同的目的,並且不需要改變項目源:

「BTrace是一個安全的,動態的Java跟蹤工具。BTrace通過動態(字節碼)程序,BTrace將追蹤操作插入正在運行的Java程序的類中,並將被追蹤的程序類加熱。「

+0

感謝您的信息,是的,我認爲這樣的事情會很理想,我實際上遇到了一個web應用程序監控應用程序,通過在我的工作中分配給我的任務我覺得有些類似的東西(使用Java代理),但這不是它的主要目的,所以BTrace可能更適合在這種情況下的需要 – Rick

+0

它看起來好像需要通過註釋某些方法進行一些修改並使它們成爲靜態的無效這與項目的網絡性質相沖突,我認爲,但這對於將來的參考肯定是有趣的 – Rick

+0

@Rick:No ,您不要更改項目源。註釋和靜態方法在您的跟蹤代碼中,完全在目標項目之外。 BTrace附加到正在運行的JVM,並在運行時將其跟蹤例程注入到它。 –

-1

通過點擊eclipse中的「Open Call Hierarchy」(左擊所選方法或CTRL + ALT + H),可以隨時查看方法的調用方式。此外,通過單擊「打開聲明」(左鍵單擊所選方法/類或F3),您始終可以檢查方法/類的定義。

+0

是的我知道所有這些,這不是我的問題所要求的。我想根據一個特定的動作得到完整的運行時調用,你說我應該這樣做的方式需要手動通過每個方法調用等,並追溯回來,效率較低 – Rick

1

您始終可以使用-verbose:class的虛擬機參數運行該應用程序。然後,您可以觀察控制檯輸出,並在執行特定操作時查看虛擬機正在加載哪些類。這可能會給你一個放置斷點的起點。根據情況,這並不總是有效,但可能會有所幫助。

+0

我正在運行一個tomcat網絡應用程序,所以我想圖也許我可以設置一個env變量或在tomcat中執行此操作的東西,必須更多地查看它 – Rick

2

當您處於調試器透視圖中時,您將看到一個顯示啓動的過程的視圖。在該視圖中,您可以告訴它暫停進程的所有線程。一旦停止,您將能夠瀏覽線索,看看他們都在做什麼。要嘗試捕捉某個特定操作正在執行的操作,您必須啓動該操作,然後快速暫停所有線程。

+0

你知道在Eclipse中調用這個視圖嗎?我似乎無法找到它,謝謝你 – Rick

+0

我想我知道你現在的男人,只是常規的「調試」選項卡,我試圖在操作過程中暫停它,它看起來像我有一些堆棧跟蹤,但不知道如果它的全部 – Rick

+0

這個解決方案絕對適合有良好反應的開發者。 ;)如果該操作涉及長時間運行的進程,可能會有所幫助。 –

1

您可以使用的另一個技巧是確定您知道哪些類必須參與您要捕獲的代碼路徑。例如,您提到它是一個Java EE Web應用程序,因此該操作可能是某種類型的servlet交互(在某個級別上)。我沒有在我面前的API,但可以在檢索輸出流的響應對象中的方法上放置一個斷點。一旦中斷,你就會知道正在嘗試處理請求的代碼。

1

幾點建議:

一些剖析會允許你從任何特定的方法了(有時向下)走走看看什麼叫和被調用。我發現了這個令人驚訝的關於流程的信息,即使在我認爲我知道的應用程序中也是如此。

爲了理解主線流程,我認爲沒有更好的替代品與調試器交互工作。它會引導你學習其他重要的東西。不是你想聽到的,我知道。這假定您可以在錯過關鍵入口時快速重新啓動應用程序。

反向設計大型遺留應用程序是我定期使用UML的一個地方。爲了形成一個好的大局,我有太多的想法了。如果你有一個UML工具可以進行逆向工程,將它加載到應用程序中,那麼很可能會在你不關心的類上嚴加修剪,因爲它們很瑣碎或明顯。以幫助您理解的方式排列圖表。我以這種方式使用了Together,Magic Draw和Visual Paradigm。一起工作最好 - 但是十年前。

+0

更多地研究了一些事情,現在我正在使用分析工具:VirtualVM,它對我的​​需求看起來非常好,基本上我只想獲得運行時查看哪些類正在使用等,以便我可以放置基於斷點反正VirtualVM是我推薦給有類似問題的任何人的東西 – Rick