我有一位客户告诉我,我的程序(简单的用户级程序,而不是驱动程序)正在使他的系统崩溃,并出现蓝屏死机(BSOD)。他说他从未在其他程序中遇到过这种情况,而且他可以很容易地用我的程序重现它。
BSOD 的类型为 CRITICAL_OBJECT_TERMINATION ( 0x000000F4
),对象类型为0x3
(进程):对系统操作至关重要的进程或线程意外退出或被终止。
一个简单的程序可以负责蓝屏死机(即使在 Vista 上......)还是应该检查硬件或操作系统安装?
仅仅因为您的程序不是驱动程序并不意味着它不会使用驱动程序。
从理论上讲,您的代码不应该能够蓝屏计算机。由操作系统来确保不会发生这种情况。根据定义,这意味着硬件或程序以外的代码中的某个地方存在问题。但这并不排除您的代码中也存在错误。
使用用户空间程序导致 BSOD 的最简单方法是 (afaik)杀死 Windows 子系统进程(csrss.exe)。这不需要有故障的硬件,也不需要内核或驱动程序中的错误,它只需要管理员权限1。
你的代码到底在做什么?错误消息(“对系统操作至关重要的进程或线程已意外退出或被终止。”)听起来像是基本系统进程之一已终止。也许你正在杀死一个进程并且无意中得到了错误的进程?
如果可能的话,您可以尝试从该客户那里获取内存转储。然后,您可以使用Windows 调试工具进一步分析该转储,如此处所述。
1 Windows 不会阻止您这样做,因为它“让管理员控制他们的计算机”。所以这是设计使然,而不是错误。阅读 Raymond 的文章,您就会明白为什么。
简短的回答是肯定的。长答案取决于您的程序应该做什么以及它是如何做到的?
通常情况下,它不应该。如果是,则必须有
我敢打赌第二个选项(设备驱动程序),但如果您能给我们提供更详细的转储,那将会很有趣。
嗯,是的,它可以——但出于许多不同的原因。
这就是为什么我们在不同的机器、操作系统、硬件等上进行测试的原因。
您是否为您的程序设定了一些要求,您的用户是否遵循这些要求?
如果您不能自己复制它,并且您的程序不需要管理员来运行,我会有点怀疑
如果您可以物理访问客户端框,则可能值得使用最新的扫描程序运行完整的病毒扫描,并在其上运行完整的memtest。
我曾经有一个看起来很稳定的系统,除了某些程序无法在其上运行(并且有时会使盒子崩溃)。Memtest 显示我的 RAM 有一些坏位,但它们在更高的 sims 中,因此只有在程序试图使用大量 RAM 时才能访问它们。
不,这几乎是根据定义。您可以说的最糟糕的事情是用户级应用程序可能“触发”了 Windows 错误或驱动程序错误。但是现代桌面操作系统对其自身的完整性负有全部责任;蓝屏死机就是这种完整性的失败。因此,操作系统负责,而且只有操作系统负责。
(您的应用程序单独可能暴露的 BSOD 错误示例:作为驱动程序实现的病毒扫描程序,在执行来自扇区 0xFFFFFFFF 的文件时崩溃,这台机器上的扇区恰好包含您的应用程序的一个 DLL)
我在退出我的应用程序时遇到问题,而在程序结束时没有停止所有进程和 BD 连接(我使整个 IDE 崩溃)。我将“停止和断开”代码放在主窗体的“Form_Closed”事件的“终止”中,问题已经解决,我不知道这是你的情况。
另一个问题可能是用户试图访问您的应用程序正在使用的相同资源(数据库、硬件、套接字等)。当 BSOD 发生时,向他/她询问他/她正在使用哪些应用程序。
病毒不能被丢弃。