2009-10-19 39 views
8

我有一位客户告诉我,我的程序(简单的用户程序,而不是驱动程序)正在使用蓝屏死机(蓝屏)崩溃系统。他说他从来没有遇到过与其他程序一样的问题,并且他可以很容易地与我的程序一起再现它。一个简单的程序可以对BSOD负责吗?

BSOD类型为CRITICAL_OBJECT_TERMINATION(0x000000F4),对象类型为0x3(进程):对系统操作至关重要的进程或线程意外退出或终止。

一个简单的程序可以对BSOD(甚至在Vista上)负责吗?还是应该检查硬件或OS安装?

+0

是它写在什么语言的一个简单的C#命令行程序? – 2009-10-19 12:41:00

+0

这是一个使用wxWidgets工具包的C++程序。 – math 2009-10-19 12:45:24

+0

@math:它*可能是wxWidgets中的一个错误,它给Win API带来了一些问题。 – voyager 2009-10-19 13:10:38

回答

5

使用用户空间程序导致蓝屏死机的最简单方法是(afaik)到kill the Windows subsystem process(csrss.exe)。这不需要错误的硬件,也不需要内核或驱动程序中的错误,它只需要管理员权限。

你的代码到底在做什么?错误消息(“对系统操作至关重要的进程或线程已意外退出或终止。”)听起来像是重要的系统进程之一终止。也许你正在杀死一个进程并无意中得到了错误的进程?

如果以某种方式可能,您可以尝试从该客户获取内存转储。使用用于Windows的调试工具,您可以进一步分析该转储,如here所述。

由于它的"keeps administrators in control of their computer",Windows并不妨碍您的doing so。所以这是设计而不是错误。阅读雷蒙德的文章,你会明白为什么。

10

只是因为你的程序不是驱动程序并不意味着它不会使用驱动程序。

从理论上讲,您的代码不应该能够导致计算机死机。确保这不会发生,取决于操作系统。根据定义,这意味着在硬件或代码以外的地方都有问题。这并不排除你的代码中存在一个错误。

+0

“理论上”?在描述Windows时可能太强大了。我不认为有一种真正的科学假设任何关于Windows的理论。我认为这更像是微软的希望。我认为正确的词可能是“希望”。 – 2009-10-19 13:29:09

+9

S.Lott:我想他的意思是在x86保护模式下,ring 3不应该能够取消ring 0.这与Windows无关。 – 2009-10-19 13:52:23

4

简短回答是肯定的。长答案取决于你的程序是做什么的,它是如何做的?

3

嗯,是的,它可以 - 但由于许多不同的原因。

这就是为什么我们测试在不同的机器,操作系统,硬件等。

有你为你的程序的一些要求,并为您的用户跟随他们?

4

通常,它不应该。如果是这样,也必须是

  • 一个Windows内核漏洞(可能的,但可能性非常小)
  • 在设备驱动程序(在程序中使用的设备的错误不一定,这有可能会相当复杂)
  • 在硬件

我敢打赌期权二号(设备驱动程序),但是如果你可以让我们更详细的转储这将是有趣的故障。

+0

+1:Windows中的错误?真?谁会想到这一点? – 2009-10-19 13:26:28

+4

@ S.Lott:令人惊讶的是,尽管所有这些Windows的笑话,但自从Windows XP以来,我所看到的一些蓝屏都可以追溯到第三方产品或硬件故障。 – 2009-10-19 13:33:02

+0

@divo:好点。但是,当第三方产品可能导致Windows崩溃时,我怀疑第三方组件之外的某个地方仍然存在bug。 – 2009-10-19 16:07:18

1

如果你自己不能复制它,你的程序不需要管理员跑,我自己也有点suspicous约

  • 该系统的硬件的稳定性
  • 病毒/该系统的恶意软件状态。

如果你能得到的客户端箱的物理访问,这可能是值得运行与上最新的扫描仪完整的病毒扫描,并运行就可以了充分memtest

我曾经有一个系统似乎很稳定,只是一些certian程序不能运行它(有时会导致程序崩溃)。 Memtest显示我的内存有一些坏点,但是它们的模拟程度较高,所以只有在程序试图使用大量内存时才能访问它们。

+0

是的,它可能是一个硬件故障。 – 2009-10-19 15:39:53

1

不,这是非常多的定义。最糟糕的是,用户应用程序可能会“触发”Windows错误或驱动程序错误。但现代桌面操作系统完全负责其自身的完整性; BSOD是这种完整性的失败。因此操作系统是负责任的,只有操作系统。

(您的应用程序本身可能会暴露的BSOD错误的示例:作为驱动程序实现的病毒扫描程序,执行扇区0xFFFFFFFF中的文件时崩溃,在此机器上的扇区恰好包含您的一个DLL应用程序)

+0

我不会说只有操作系统负责。当然操作系统应该从非特权应用程序中解开,但我们必须处理真实的操作系统。 – 2009-10-19 15:59:09

+0

操作系统错误是不争的事实,但观察并没有带走责任。 – MSalters 2009-10-20 07:46:05

-1

当程序结束时(我崩溃了整个IDE),退出我的应用程序时没有停止所有进程和BD连接,但出现问题。我在主窗体的“Form_Closed”事件的“终止”事件中放置了“停止和断开连接”的代码,问题解决了,我不知道这是你的情况。

如果用户试图访问您的应用程序正在使用的相同资源(数据库,硬件,套接字等),则可能会出现另一个问题。向他/她询问他/她在蓝屏发生时使用的应用程序。

病毒不能被丢弃。

+0

有趣的是,答案可以在八年后收集负面投票(我当时那么年轻!) – 2017-04-06 17:12:23

-1

下面是导致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); 
    } 
} 
+0

这已经被接受的答案 - 八年前提到过。 – duskwuff 2017-04-04 07:42:02

相关问题