2017-09-07 47 views
1

我在應用程序中遇到了一些奇怪的文本格式,我需要找到原因。問題是我不知道從哪裏開始尋找我們的遺留代碼。

是否可以讓IntelliJ IDEA調試器在整個JVM應用程序的整個實例中搜索一個值?與通常情況下設置斷點的方式不同。使用IntelliJ IDEA調試器在運行時搜索整個JVM以獲取價值

+0

我不明白你的意思是「尋找價值」。你的意思是堆在堆棧裏嗎?最初,因爲你在談論格式化,我以爲你在談論代碼。 – ProgrammersBlock

+0

您可以爲「任何異常」設置斷點(CTRL + SHIFT + F8),它會在引發異常時設置斷點,還可以添加條件以迭代範圍(「this」)變量並檢查類型(我假定String in這種情況下)和價值 – IddoE

回答

1

this question的評論來看,IntelliJ中沒有這樣的功能。

然而,您可以嘗試執行堆轉儲,然後使用OQL進行搜索。它可以在VisualVM工具,它是捆綁在一起的JDK來完成:

  1. 運行jvisualvm命令(假設你的JDK的bin文件夾中PATH)。
  2. 啓動您的應用程序,在本地的左側列中找到它,並從右鍵菜單中選擇堆轉儲
  3. 前往OQL控制檯查看。在查詢編輯器,鍵入您的查詢,例如:

    select s from java.lang.String s where s.toString().contains("hello") 
    

    並執行它。

  4. 如果你的對象在堆上,你應該看到它。點擊它並檢查參考對象參考文獻

這應該讓你更接近你的對象被使用的類/對象。

有一些棘手的部分:

  • 必須執行堆轉儲之前所討論的對象是垃圾回收 - 儘快你確信創建對象(其他經過是這樣,獲取堆轉儲的方式描述如下:here),
  • 該對象可能無法訪問。在這種情況下,嘗試查看它所屬的對象圖並查找仍被引用的其他對象,對象可能根本不在活頁堆中(escape analysis)。

堆轉儲分析的另一個工具是Eclipse Memory Analyzer (MAT)。 (針對您的使用案例,在分析堆轉儲之前啓用保留無法訪問的對象選項。)

您提到您需要在運行時搜索該值。但是,如果您懷疑要查找的是字符串文字,請嘗試按照this answer中所述搜索應用程序的JAR。

相關問題