2015-02-06 94 views
1

在我的WinForms應用程序我得到下面的異常隨機場合:C#的WinForms:調試策略,找到原因System.AccessViolationException

Application: My.Shell.exe 
Framework Version: v4.0.30319 
Description: The process was terminated due to an unhandled exception. 
Exception Info: System.AccessViolationException 
Stack: 
    at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG ByRef) 
    at System.Windows.Forms.Application+ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr, Int32, Int32) 
    at System.Windows.Forms.Application+ThreadContext.RunMessageLoopInner(Int32, System.Windows.Forms.ApplicationContext) 
    at System.Windows.Forms.Application+ThreadContext.RunMessageLoop(Int32, System.Windows.Forms.ApplicationContext) 
    at System.Windows.Forms.Application.Run(System.Windows.Forms.Form) 
    at Microsoft.Practices.CompositeUI.WinForms.FormShellApplication`2[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].Start() 
    at Microsoft.Practices.CompositeUI.CabApplication`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].Run() 
    at My.Shell.ModuleLoader.Main() 

堆棧跟蹤是從Windows事件查看器。 (該unandeled異常處理程序沒有得到它。)

我看了很多文章對此的SO:

它事實證明,我的應用程序somwhere訪問通過本地方法處置或損壞的內存。我現在的問題是如何使用我使用taskmanager製作的crashdump來查找該位置。 是否有其他策略可以找到原因?

+0

您是否在深度標記了異常 - 促銷,您需要? – icbytes 2015-02-06 13:49:34

+0

我該怎麼做?從未聽說過「促進例外」。你能解釋一下這是什麼意思嗎?謝謝。 – schoetbi 2015-02-06 13:52:39

+0

@schoetbi你在代碼庫的任何地方使用COM Interop嗎? – toadflakz 2015-02-06 13:56:06

回答

0

這可能有助於使用SOS並打破第一個未處理的異常並從那裏開始。

如果需要,您也可以動態啓動調試器。請參閱「System.Diagnostics」。

這將允許您概述導致或允許發生異常的情況,並且能夠在不等待連接調試器時發生錯誤的情況下進行跟蹤。

0

我結束了這個美妙的工具:「調試診斷工具」從微軟。查看CodeProject

細節「調試診斷工具(DebugDiag資料)旨在幫助 故障排除問題,如掛起,性能下降,內存泄漏中的任何用戶模式進程 或碎裂,和崩潰。」 (microsoft.com)與其他調試工具相比,DebugDiag工具使用起來要簡單得多。

該工具automaticaly監視特定的進程並將dumpfiles保存到可選文件夾中。非常方便;-)

1

我發現在WinForms中通常不會觸發UnhandledExceptionThreadException事件。在我的應用程序中,我有三種不同的方式來捕捉未處理的異常。通常這只是try catch它得到它。

static void Main(string[] args) 
{ 
    Application.ThreadException += Application_ThreadException; 
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 
    AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 

    try 
    { 
     var mform = new MainForm(); 
     Application.Run(mform); 
    } 
    catch (Exception ex) 
    { 
     HandleException(ex); 
    } 
} 

private void Application_ThreadException(object sender, ThreadExceptionEventArgs e) 
{ 
    HandleException(e.Exception); 
} 

private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    HandleException(e.ExceptionObject as Exception); 
} 

private void HandleException(Exception ex) 
{ 
    // Do something with it 
} 
+0

我已經訂閱了我自己的處理程序,但不會被解僱。看到我的答案我使用了「調試診斷工具」給了我答案,謝謝;-) – schoetbi 2015-02-10 14:10:24

+0

@schoetbi就像我說的,他們通常不會被解僱。但頂級嘗試捕獲確實捕捉到異常。 – kjbartel 2015-02-12 01:19:26

+0

好的,現在我明白了。感謝+1 – schoetbi 2015-02-14 08:53:58