未处理的C#异常

7

一个未处理的C#应用程序异常是否会导致蓝屏?


1
驱动程序可能期望您以特定的方式与其交互,因此间接地说,异常可能会改变您与驱动程序交互的方式,然后揭示潜在缺陷。如果您无法更新驱动程序,则最好的选择是缩小触发该错误的特定用例范围,并绕过它。 - Dan Bryant
6个回答

14

除非你在处理未受控资源(例如原始内存访问),否则不会发生异常。 (在这种情况下,异常不太可能是原因)

.NET 异常将被运行时环境捕获。您可以使程序崩溃,但无法使操作系统崩溃。

根据我的经验,导致蓝屏的唯一原因是糟糕的驱动程序和硬件错误。 (当然,这不是造成蓝屏的原因列表的详尽清单,但这是我首先查看的地方。)


@Stephen Cleary:我相当确定调用引用有问题的驱动程序的非托管代码可能会导致蓝屏死机,但重点是在.NET上下文中(异常所在的地方),您不会导致蓝屏死机。一旦离开托管代码,就没有保证了。 - Aren
@Aren:你说的“调用引用有问题的驱动程序的非托管代码可能会导致蓝屏死机”是什么意思?能否详细说明一下? - Jim Fell
一个驱动文件(ser2pl.sys),它是为了USB转RS232转换器而安装的,被明确指出是BSOD上的问题。我尝试了许多不同的方法,但(长话短说)BSOD只会在配备遗留的USB 1.1根集线器的旧系统上发生(相同的操作系统:WinXP SP3)。然而,使用相同转换器的其他C#应用程序不会导致崩溃。更改波特率和驱动程序端口配置似乎没有任何影响。 - Jim Fell
跟进:事实上,不仅仅是.NET代码。用户模式代码(包括.NET代码和本地代码)不能导致蓝屏死机。蓝屏死机只能由内核模式代码中的错误引起,该代码由操作系统及其驱动程序组成(或者是实际硬件故障)。在这三种原因中,驱动程序是最常见的罪魁祸首。 - Stephen Cleary
@Aren:非驱动程序的非托管代码不会导致蓝屏死机。特别是,即使在非托管代码中写入各种内存位置,也不会导致蓝屏死机(但驱动程序写入随机内存位置可能会导致蓝屏死机)。 - Stephen Cleary
显示剩余2条评论

3

蓝屏的唯一原因是硬件错误、操作系统漏洞或驱动程序漏洞。.NET代码永远不会导致蓝屏。


是的,一个驱动文件(ser2pl.sys)被安装用于 USB-to-RS232 转换器,并且明确地被称为 BSOD 问题的起因。我尝试了许多不同的方法,但简而言之,BSOD 只会出现在配备遗留的 USB 1.1 根集线器的旧系统上(相同操作系统:WinXP SP3)。然而,使用相同转换器的其他 C# 应用程序并不会导致崩溃。更改波特率和驱动程序端口配置似乎没有任何影响。 - Jim Fell
我猜这是WinDbg analyze -v的结果,这种分析至少有95%的正确率。你能做的几乎唯一的事情就是更新驱动程序(如果这些是客户机器,则指示客户进行更新)。 - Stephen Cleary
谢谢。WinDbg是什么?它是C#的一部分吗,还是用于报告BSOD上的错误? - Jim Fell
1
啊,不是的。它是 Windows 调试工具 的一部分。蓝屏一般会创建一个完整转储或小转储(可在系统属性下配置),而这个转储文件可以加载到 WinDbg 中。最常见的过程是输入 !analyze -v,它会自动分析蓝屏情况,显示最有可能的罪魁祸首。 - Stephen Cleary

2

不应该有任何一种方法可以从C#引起蓝屏死机。

请给我们展示导致蓝屏的代码,我们会尽力提供帮助。


2
不会的。这并不是说你不能用C#程序潜在地导致蓝屏死机,但如果确实发生了,那不是因为未处理异常被抛出。

2
是的,间接地可以。当您使用名称空间(如System.Management、System.Windows.Media、System.Drawing.Printing和System.IO.Ports)时,会使用大量未经管理的代码。该代码可以发出设备驱动程序调用,从而触发设备驱动程序中的错误。然后就会出现蓝屏。
显然,真正的问题不在托管代码中,而是在糟糕的驱动程序中。
但是直接回答问题:未处理的托管异常无法导致蓝屏。

0
无论如何,看起来驱动程序本身有问题:蓝屏是内核中运行的代码未处理崩溃的结果(在这种情况下是您的驱动程序)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接