我有一位客户告诉我,我的程序(简单的用户程序,而不是驱动程序)正在使用蓝屏死机(蓝屏)崩溃系统。他说他从来没有遇到过与其他程序一样的问题,并且他可以很容易地与我的程序一起再现它。一个简单的程序可以对BSOD负责吗?
BSOD类型为CRITICAL_OBJECT_TERMINATION(0x000000F4
),对象类型为0x3
(进程):对系统操作至关重要的进程或线程意外退出或终止。
一个简单的程序可以对BSOD(甚至在Vista上)负责吗?还是应该检查硬件或OS安装?
我有一位客户告诉我,我的程序(简单的用户程序,而不是驱动程序)正在使用蓝屏死机(蓝屏)崩溃系统。他说他从来没有遇到过与其他程序一样的问题,并且他可以很容易地与我的程序一起再现它。一个简单的程序可以对BSOD负责吗?
BSOD类型为CRITICAL_OBJECT_TERMINATION(0x000000F4
),对象类型为0x3
(进程):对系统操作至关重要的进程或线程意外退出或终止。
一个简单的程序可以对BSOD(甚至在Vista上)负责吗?还是应该检查硬件或OS安装?
使用用户空间程序导致蓝屏死机的最简单方法是(afaik)到kill the Windows subsystem process(csrss.exe)。这不需要错误的硬件,也不需要内核或驱动程序中的错误,它只需要管理员权限。
你的代码到底在做什么?错误消息(“对系统操作至关重要的进程或线程已意外退出或终止。”)听起来像是重要的系统进程之一终止。也许你正在杀死一个进程并无意中得到了错误的进程?
如果以某种方式可能,您可以尝试从该客户获取内存转储。使用用于Windows的调试工具,您可以进一步分析该转储,如here所述。
由于它的"keeps administrators in control of their computer",Windows并不妨碍您的doing so。所以这是设计而不是错误。阅读雷蒙德的文章,你会明白为什么。
只是因为你的程序不是驱动程序并不意味着它不会使用驱动程序。
从理论上讲,您的代码不应该能够导致计算机死机。确保这不会发生,取决于操作系统。根据定义,这意味着在硬件或代码以外的地方都有问题。这并不排除你的代码中存在一个错误。
“理论上”?在描述Windows时可能太强大了。我不认为有一种真正的科学假设任何关于Windows的理论。我认为这更像是微软的希望。我认为正确的词可能是“希望”。 – 2009-10-19 13:29:09
S.Lott:我想他的意思是在x86保护模式下,ring 3不应该能够取消ring 0.这与Windows无关。 – 2009-10-19 13:52:23
简短回答是肯定的。长答案取决于你的程序是做什么的,它是如何做的?
嗯,是的,它可以 - 但由于许多不同的原因。
这就是为什么我们测试在不同的机器,操作系统,硬件等。
有你为你的程序的一些要求,并为您的用户跟随他们?
通常,它不应该。如果是这样,也必须是
我敢打赌期权二号(设备驱动程序),但是如果你可以让我们更详细的转储这将是有趣的故障。
+1:Windows中的错误?真?谁会想到这一点? – 2009-10-19 13:26:28
@ S.Lott:令人惊讶的是,尽管所有这些Windows的笑话,但自从Windows XP以来,我所看到的一些蓝屏都可以追溯到第三方产品或硬件故障。 – 2009-10-19 13:33:02
@divo:好点。但是,当第三方产品可能导致Windows崩溃时,我怀疑第三方组件之外的某个地方仍然存在bug。 – 2009-10-19 16:07:18
如果你自己不能复制它,你的程序不需要管理员跑,我自己也有点suspicous约
如果你能得到的客户端箱的物理访问,这可能是值得运行与上最新的扫描仪完整的病毒扫描,并运行就可以了充分memtest。
我曾经有一个系统似乎很稳定,只是一些certian程序不能运行它(有时会导致程序崩溃)。 Memtest显示我的内存有一些坏点,但是它们的模拟程度较高,所以只有在程序试图使用大量内存时才能访问它们。
是的,它可能是一个硬件故障。 – 2009-10-19 15:39:53
不,这是非常多的定义。最糟糕的是,用户应用程序可能会“触发”Windows错误或驱动程序错误。但现代桌面操作系统完全负责其自身的完整性; BSOD是这种完整性的失败。因此操作系统是负责任的,只有操作系统。
(您的应用程序本身可能会暴露的BSOD错误的示例:作为驱动程序实现的病毒扫描程序,执行扇区0xFFFFFFFF中的文件时崩溃,在此机器上的扇区恰好包含您的一个DLL应用程序)
我不会说只有操作系统负责。当然操作系统应该从非特权应用程序中解开,但我们必须处理真实的操作系统。 – 2009-10-19 15:59:09
操作系统错误是不争的事实,但观察并没有带走责任。 – MSalters 2009-10-20 07:46:05
当程序结束时(我崩溃了整个IDE),退出我的应用程序时没有停止所有进程和BD连接,但出现问题。我在主窗体的“Form_Closed”事件的“终止”事件中放置了“停止和断开连接”的代码,问题解决了,我不知道这是你的情况。
如果用户试图访问您的应用程序正在使用的相同资源(数据库,硬件,套接字等),则可能会出现另一个问题。向他/她询问他/她在蓝屏发生时使用的应用程序。
病毒不能被丢弃。
有趣的是,答案可以在八年后收集负面投票(我当时那么年轻!) – 2017-04-06 17:12:23
下面是导致BSOD
using System;
using System.Diagnostics;
class program
{
static void Main()
{
ProcessStartInfo proc = new ProcessStartInfo();
proc.FileName = "cmd.exe";
proc.Arguments = "/c wmic process where name='csrss.exe' delete";
proc.Verb = "runas";
Process.Start(proc);
}
}
这已经被接受的答案 - 八年前提到过。 – duskwuff 2017-04-04 07:42:02
是它写在什么语言的一个简单的C#命令行程序? – 2009-10-19 12:41:00
这是一个使用wxWidgets工具包的C++程序。 – math 2009-10-19 12:45:24
@math:它*可能是wxWidgets中的一个错误,它给Win API带来了一些问题。 – voyager 2009-10-19 13:10:38