2015-05-13 36 views
0

我們有一個託管的C#應用​​程序(MS Visual Studio 2010,目標框架:.Net 4客戶端配置文件),它通過Interop使用非託管COM對象,還利用P/Invoke調用函數我們自己的DLL(C++)。 P/Invoke呼叫是從System.Threading.Task程序制定的,因此可以同時進行。我們將同時執行的任務總數限制爲10.運行託管C#應用程序的MS VC++運行時庫錯誤

應用程序可以運行一段時間,持續創建任務並調用非託管函數。在某個時候彈出一個對話框 - Microsoft Visual C++運行時庫/運行時錯誤! /應用程序請求運行系統以不尋常的方式終止它 ...

作爲對話框的結果沒有創建事件日誌條目。 enter image description here

當顯示對話框,應用程序繼續運行,但其內存使用率不斷攀升。在TaskManager和VMMap(Sysinternals)中監視時,內存使用會再增加5-10分鐘,然後應用程序崩潰。

問題是 - 即使錯誤對話框出現後,爲什麼應用程序仍會繼續運行?

就在崩潰前,即內存耗盡時,任何試圖分配內存並被C#捕獲的代碼都會拋出System.OutOfMemoryException

在這一點上的應用程序事件日誌中有一個新的條目

所以如下指示:

Faulting module name: KERNELBASE.dll, version: 6.1.7601.18798 Exception code: 0xe0434352 Fault offset: 0x0000c42d Description: The process was terminated due to an unhandled exception. Exception Info: System.AccessViolationException

沒有進一步的信息,請訪問;轉儲文件不會生成。 我們的非託管組件(COM DLL,DLL)不會顯示爲錯誤模塊。

下面是我們迄今使用的工具列表:

  • DBGVIEW從涉及的組件查看ATL痕跡。

  • 的VMMap調查碎片,堆等

  • DebugDiag資料檢查內存泄漏,分析託管和非託管內存,調用堆棧等

如果有任何其他技術或可用於確定導致MS C++運行時錯誤的調用的實際序列的方法,那麼將不勝感激。

+3

由於您看到內存使用量增加,因此可能會開始查看非託管PInvoke調用以及如何編組數據。它是一個深刻的主題,但沒有固定內存,允許內存被垃圾收集,而未損壞的代碼仍在使用它,包括線程對這些數據可能的競爭條件,都可能導致異常崩潰。我祝你好運,這是一個艱難的cookie來破解。 – Kratz

+0

您需要調試。儀器和檢查。對於狹窄的SO而言,這不是一個真正的主題。 –

+0

@CaptainObvlious我不認爲要求一個方法使這個題外話。 – JNK

回答

1

在廣泛嘗試隔離崩潰原因後,調試診斷工具(v2 Update 1)Microsoft提供了所需的信息。

我們使用Debug Diag的Crash/Hang Analyzer作爲我們正在處理的過程。 在工具/選項下&設置/符號搜索路徑對於Analaysis,我們爲所有組件(.Net應用程序,C++ DLL等)指定.PDB文件的位置。)

一旦崩潰,調試Diag的結果調用堆棧精確地針對我們正在使用的非託管第三方DLL的調用,導致訪問衝突異常/崩潰。