我們有一個託管的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++運行時庫/運行時錯誤! /應用程序請求運行系統以不尋常的方式終止它 ...
作爲對話框的結果沒有創建事件日誌條目。
當顯示對話框,應用程序繼續運行,但其內存使用率不斷攀升。在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++運行時錯誤的調用的實際序列的方法,那麼將不勝感激。
由於您看到內存使用量增加,因此可能會開始查看非託管PInvoke調用以及如何編組數據。它是一個深刻的主題,但沒有固定內存,允許內存被垃圾收集,而未損壞的代碼仍在使用它,包括線程對這些數據可能的競爭條件,都可能導致異常崩潰。我祝你好運,這是一個艱難的cookie來破解。 – Kratz
您需要調試。儀器和檢查。對於狹窄的SO而言,這不是一個真正的主題。 –
@CaptainObvlious我不認爲要求一個方法使這個題外話。 – JNK