我有一个计算量很大的多线程 C# 应用程序,它似乎在运行 30-90 分钟后一直崩溃。它给出的错误是
运行时遇到致命错误。错误地址位于线程 0xbcc 上的 0xec37ebae。错误代码为 0xc0000005。此错误可能是 CLR 中的错误或用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括 COM 互操作或 PInvoke 的用户封送错误,这可能会损坏堆栈。
(0xc0000005 是Access Violation的错误代码)
我的应用程序不调用任何本机代码,也不使用任何不安全的块,甚至不使用任何不符合 CLS 的类型,例如uint
. 事实上,调试器所说的导致崩溃的代码行是
overallLength += distanceTravelled;
两个值都是类型double
鉴于这一切,我认为崩溃一定是由于编译器或 CLR 或 JIT 中的错误。我想弄清楚是什么原因造成的,或者至少写一个较小的复制品发送给微软,但我什至不知道从哪里开始。我从来不需要查看 CIL 二进制文件、编译的 JIT 输出或本机堆栈跟踪(崩溃时没有托管堆栈跟踪),所以我不确定如何。我什至不知道如何在崩溃时查看所有变量的状态(不幸的是,VS 不会像在托管异常之后那样告诉我,并且将它们输出到控制台/文件会减慢app 1000 倍,这显然不是一个选项)。
那么,我该如何调试呢?
[编辑]在 VS 2010 SP1 下编译,运行最新版本的 .Net 4.0 Client Profile。显然它是“.Net 4.0C/.Net 4.0E,.Net CLR 1.1.4322”