C# Visual studio,调试在mscorlib.dll中随机抛出SEHException未经处理的异常,没有堆栈跟踪

C# Visual studio,调试在mscorlib.dll中随机抛出SEHException未经处理的异常,没有堆栈跟踪,c#,visual-studio,exception,unhandled-exception,mscorlib,C#,Visual Studio,Exception,Unhandled Exception,Mscorlib,我有一个C#Windows窗体应用程序,它(在调试模式之外)工作得非常好。当我在调试模式下运行它时,我所做的每一个操作都有随机机会使应用程序崩溃(比如单击按钮或关闭主窗体)。有很多异步代码在后台运行,但即使没有任务在运行,应用程序也会崩溃(formClosing方法是一种完全同步的方法)。值得注意的是,我的应用程序中大多数按钮单击的第一件事是更改某些按钮的可视性和启用属性,然后将开始向日志中写入消息-在写入任何日志之前,应用程序会崩溃(使用NLog) 引发的错误是: System.Runtime

我有一个C#Windows窗体应用程序,它(在调试模式之外)工作得非常好。当我在调试模式下运行它时,我所做的每一个操作都有随机机会使应用程序崩溃(比如单击按钮或关闭主窗体)。有很多异步代码在后台运行,但即使没有任务在运行,应用程序也会崩溃(formClosing方法是一种完全同步的方法)。值得注意的是,我的应用程序中大多数按钮单击的第一件事是更改某些按钮的可视性和启用属性,然后将开始向日志中写入消息-在写入任何日志之前,应用程序会崩溃(使用NLog)

引发的错误是:

System.Runtime.InteropServices.SEHException
  HResult=0x80004005
  Message=External component has thrown an exception.
  Source=<Cannot evaluate the exception source>
  StackTrace:
<Cannot evaluate the exception stack trace>
尝试恢复应用程序只会结束调试会话

触发崩溃的不是代码或事件的任何特定部分,而且代码在调试模式之外从未崩溃,这一事实让我相信这可能是Visual Studio的问题。我是否可以在Visual studio中配置任何设置,以降低发生此崩溃的可能性?或者如果没有,是否有任何方法可以获得比“无法评估stackTrace”更多的信息

其他可能相关或不相关的信息,内存和CPU使用率在崩溃时都非常低(40MB左右,CPU使用率约为5%)。我正在运行最新的Visual Studio社区2019。该应用程序在.Net Framework 4.8上运行。我的操作系统是运行windows 10 enterprise的本地虚拟机。我也不认为我正在运行任何可信的应用程序

我的代码也被大量的Try捕获,尤其是在点击按钮的时候

谢谢你的帮助,如果我遗漏了任何相关信息,请告诉我

编辑:我发现了导致问题的那一行,注释掉这一行会使应用程序运行良好,完全没有错误

var ignore = currentJob.jobConfig.ToObject(t); //jobConfig is a JObject
强制转换工作正常,但通过执行强制转换,会以某种方式触发上面提到的和下面显示的异常


编辑#2:修复、更新和重新安装visual Studio并没有改变这个问题,应用程序在10-40%的时间里似乎仍能正常工作,而在其余时间崩溃

我通过添加“return;”找到了解决问题的方法语句,并逐个删除它们(删除代码的大部分)。我最终找到了引起问题的线路。事实证明,如果序列化然后反序列化CancellationToken,visual studio的调试会话可能会在尝试对反序列化到的对象执行特定操作时随机崩溃。解决方案只是将取消令牌设置为私有,或者添加[JsonIgnore]

重现问题的代码:(运行void方法,然后尝试关闭窗口)

那么,我最初的问题的答案是,从Jeroan的解决方案开始,尝试在不同的设备上调试,如果该设备上的代码仍然中断,那么尝试对我有效的方法(黑客和斜杠你的代码,直到你发现是什么中断了它)-或者更复杂的方法来更彻底地调试你的代码。如果您的代码在其他设备上运行,请尝试Micheal的方法更新/修复/重新安装您的Visual Studio安装


当然,有一件事我仍然不知道如何去做,那就是找到错误的代码,而不用花一个小时删除代码的各个部分,直到我找到原因。

听起来像是一种腐败。第一个id尝试在安全模式下运行VS,看看它是否是一个扩展。然后,如果失败,请按此顺序尝试以下操作。升级/维修/reinstall@MichaelRandall不幸的是,这四件事都没有解决我的问题,你还有其他的建议吗?在另一台机器上试试。要么是你的应用程序做了一些有趣的事情导致了腐败,要么是你机器上的某个第三方工具/钩子做了一些有趣的事情,而使用另一台机器(最好是一个干净的VM,除了VS之外什么都没有)可以让你区分这两者。您还可以使用下面窗格中带有DLL视图的Process Explorer之类的工具,预先扫描可能会导致问题的东西。它似乎在任何机器上都会相当可靠地崩溃(耶),我将尝试关闭大部分代码,直到我找到导致此问题的条件集,谢谢你的提示,不是这样的。你仅仅是重新安排了家具,这个记忆衰退的问题会在另一个时间在另一个地方打碎你的膝盖。如果您无法获得代码审查,那么致电Microsoft支持部门寻求帮助往往是值得的。但是,这部分代码在一个完全干净/全新的应用程序中会导致相同的问题,代码在多台计算机、VS安装和应用程序上崩溃-您确定这不是我的问题吗?
var ignore = currentJob.jobConfig.ToObject(t); //jobConfig is a JObject
    private void BreakVS()
    {
        ClassWithCancellationToken someClass = new ClassWithCancellationToken();
        someClass.ts = new CancellationToken();
        var json = JsonConvert.SerializeObject(someClass);
        JObject jObject = JObject.Parse(json);
        var test = jObject.ToObject(typeof(ClassWithCancellationToken));
    }

    public class ClassWithCancellationToken
    {
        public CancellationToken ts; //change to private to 
    }