2015-06-06 191 views
2

我試圖運行和調試 sunrid.jsp.tools和sun.jvm.hotspot.utilities (如JMap.java)以更好地理解正在發生的事情。JMap.java - 嘗試連接到調試服務器時超時 - SwDbgSrv.exe

不幸的是我陷得很早,出現以下錯誤消息,他們甚至沒有得到調試了很多:

Attaching to process ID 5144, please wait... 
Error attaching to process: Timed out while attempting to connect to debug server (please start SwDbgSrv.exe) 

好像無論什麼原因,工具試圖連接到一個「調試服務器「在端口27000

運行在sun.jvm.hotspot.tools.HeapDumer.java的文檔,我發現以下幾點:

該工具使用的JDK JMAP實用程序來轉儲堆的 目標進程/核心作爲HPROF二進制文件。如果需要,它也可以作爲 獨立工具使用。

所以我(可能天真地)認爲jmap.exe是以某種方式使用它,但我從來沒有遇到過使用jmap創建堆轉儲的這類問題。我從不需要首先啓動另一個進程。

任何想法,我需要做的直接從我的開發環境中運行所有這些工具?

感謝

回答

0

sun.jvm.hotspot.*工具是HotSpot Serviceability Agent的一部分。

我假設您在Windows上使用JDK 6,因爲從JDK 7開始不再需要調試服務器。在早期版本中,您必須啓動SwDbgSrv.exe才能使用Serviceability Agent。

某些內置的JDK實用程序(jmap,jstack)有兩種執行模式:合作和強制。在正常的協作模式下,這些工具使用Dynamic Attach Mechanism連接到目標VM。所請求的命令然後由目標VM從目標進程內直接執行。

強制模式(jmap -F,jstack -F)的行爲完全不同。該工具暫停目標進程,然後使用可維護性代理讀取進程內存。當目標VM暫停時,該命令在工具的進程中執行。這是sun.jvm.hotspot.*實用程序所做的。

+0

有趣的答案,不知道有從JDK 6到7的變化。其實我還是不明白它:1.我沒有'SwDbgSrv.exe',甚至沒有我的JDK 6安裝。 2.我使用開放的** JDK 7 **源代碼('sun.jvm.hotspot.tools.HeapDumper,sun.jvm.hotspot.tools.JMap'等),並且工具仍然需要啓動此服務器(沒有線索我可以得到它)。我想調試Eclipse中的工具,因此試圖在那裏開始,而不是在控制檯上執行jmap(對不起,如果從上面不清楚)。還有什麼想法? –

+0

@HaasipSatang 1.'SwDbgSrv.exe'不附帶JDK。你有過時的消息來源。你從哪裏弄到的? [Here](http://hg.openjdk.java.net/jdk7u/jdk7u/hotspot/)是最新的JDK 7 HotSpot源代碼。你可能根本不需要這些工具。正如我所說的,你可以使用Dynamic Attach來獲得線程轉儲或堆轉儲。這很容易。查看[JVM可維護性示例](https://github.com/odnoklassniki/jvm-serviceability-examples),特別是[demo2](https://github.com/odnoklassniki/jvm-serviceability-examples/blob/master /src/demo2/VmCommand.java)。 – apangin

+0

謝謝。我真的有一個相當老的OpenJDK 7源代碼版本。但它是7,而不是6。所以,在7之內可能發生了變化。所以當我用OpenJDK開始我的項目並使用JMap的新源時,它現在連接並且我可以調試。我不得不創建一個sa.properties文件,並使用sun.jvm.hotspot.runtime.VM.disableVersionCheck = true(因爲我不知道要設置哪些值)。所以我顯然還沒有正確使用它,但至少現在它可以工作,我可以調試。出於好奇,你知道我在哪裏可以找到'SwDbgSrv.exe',以防我有一天需要它嗎? –

相關問題