识别Visual Studio调试器导致的第一次机会异常

时间:2014-03-05 16:11:11

标签: c# debugging visual-studio-2012

我正在订阅AppDomain.FirstChanceException事件,并且在发生异常时,将堆栈跟踪写入Visual Studio 2012中的Debug窗口(以及跟踪文件)。此机制用于发现开发期间的潜在问题,但未在代码的生成版本中使用。

但是,我得到了第一次机会异常记录,只有在Visual Studio中调试并遇到断点时才会发生。例如:

First chance exception of type [ThreadAbortException]
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at Microsoft.VisualStudio.Debugger.Runtime.Main.ThrowCrossThreadMessageException(String formatString)
at System.Windows.Forms.SafeNativeMethods.GetWindowTextLength(HandleRef hWnd)
at System.Windows.Forms.Control.get_WindowText()
at System.Windows.Forms.Form.get_WindowText()
at System.Windows.Forms.Control.get_Text()
at System.Windows.Forms.Form.get_Text()
at System.Windows.Forms.Form.ToString()
at Test.Form1.<Form1_Load>b__3(Object obj)
at System.Action`1.Invoke(T obj)
at Test.MyClass.<DoStuff>b__13(Object obj)
at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
at System.Threading.ThreadPoolWorkQueue.Dispatch()
at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()

请注意,我的代码在任何时候都不与表单进行交互。

我的问题是,是否有一种可靠的方法来确定异常纯粹是因为调试,所以我的日志代码可以忽略它?我可以在堆栈跟踪中查找字符串'Microsoft.VisualStudio.Debugger',但我不确定是否会捕获可能出现问题的所有情况。

要明确的是,我对所显示的特定异常的原因不感兴趣,只是在寻找一种方法来清除由调试引起的异常。

我无法发布代码,因为没有一些我无法发布的支持代码就没有意义。我不是要寻求解决异常 - 这在调试时会发生,但不会发生 - 只是为了确定我是否可以在AppDomain.FirstChanceException事件的事件处理程序中识别源自调试器的第一次机会异常。

这是一个天真的例子:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        Foo foo = new Foo();
    }
}

public class Foo
{
    public string Oops { get { throw new Exception("Oops"); } }
}

创建foo后的断点并在本地窗口中展开foo。显然这会导致异常,但是在visual studio之外运行代码却不会。

0 个答案:

没有答案