2011-08-17 138 views
4

我打算從.NET中調用MiniDumpWriteDump來生成小型轉儲,並且工作正常。但是,當我將結果轉儲加載到VS 2010中時,我沒有看到任何有用的信息。特別是,調用堆棧窗口看起來是這樣的:在VS 2010中調試小型轉儲時遇到的問題

Call stack

它不包含任何管理框架,雖然我寫轉儲而在託管代碼中的異常處理程序。此外,它不包含位於我的exe中的任何框架。

任何想法爲什麼發生這種情況?

順便說一句,當我從VS調試器手動創建轉儲時,轉儲確實包含按預期方式管理的幀。

編輯:

我發現一個Microsoft Connect issue這一點。它說:

目前CLR不支持託管進程採取自己的 轉儲。

任何人都知道這是否仍然如此?

+0

調試使用託管代碼小型轉儲保持在VS2010一個可疑的喜悅。只是一些提示:您需要啓用Microsoft Symbol服務器,以便調試器可以藉助Windows .pdb文件正確地使用非託管堆棧。您需要將MiniDumpWriteDump()選項設置爲11,以便在小型轉儲中捕獲垃圾收集堆。如果你創造的那個和VS創造的一樣巨大,你做得對。 –

+0

@stefan http://msdn.microsoft.com/en-us/magazine/cc188701.aspx - 「在衝破所有我能想到的東西之後,我意識到我從其他堆棧獲取信息的唯一途徑是產生一個將信息傳遞迴SUPERASSERT.NET的進程。「和「雖然這個想法是從流程內部走過所有的堆棧,但沒有可行的方法來實現這一點。」 –

回答

2

我發現我的錯誤。我正在查看錯誤線程的調用堆棧(我沒有意識到有多個線程正在運行)。現在我可以看到託管調用堆棧很好。

0

我在應用程序中做了類似的事情(即調用MiniDumpWriteDump,然後調試調試器中的轉儲)。

每當我有這個問題,有兩個可能的原因:

  • 要麼符號信息丟失
  • 或在轉儲時使用的過程中,DLL或EXE缺失

第一個原因很容易解決。在VS2010中,您可以簡單地右鍵單擊調用堆棧或模塊窗口中的DLL,然後選擇「從Microsoft服務器加載符號」。

第二個原因更難解決。如果缺少DLL或EXE,調試器拒絕讓您調試它,甚至拒絕查看這些符號。訣竅是從DMP文件生成一個虛擬DLL/EXE。請查看http://www.debuginfo.com/tools/modulerescue.html獲取MODULERESCUE實用程序。該實用程序可以爲給定的DMP文件生成虛擬DLL和EXE,這足以滿足調試器的要求,以便它再次加載符號。

+0

謝謝。我發現我的錯誤,那是我在看錯誤的線程。 –