C#程序使系统崩溃立即停止(用于系统可恢复性测试),模拟严重的硬件错误

时间:2009-08-19 09:50:12

标签: c#

我需要对系统可恢复性进行测试,包括突然崩溃系统而不发出警告(“硬崩溃”,没有关机解决方法)。

我正在寻找尽可能接近完全崩溃系统的严重硬件错误(蓝屏HALT或更糟,例如.sudden reboot类似于不可恢复的内存/ CPU错误)。

我怎么能在C#中做这样的事情(可能是非托管代码?)?

5 个答案:

答案 0 :(得分:2)

查找并终止运行csrss.exe的进程。这将照顾它。

答案 1 :(得分:2)

我总是发现翻转电源开关(在墙上插座上)可以完美地用于此解决方案 - 特别是当我只想关闭显示器时。

如果您需要通过键盘进行操作,请检查here以获取生成BSOD的方法。

编辑:快速谷歌建议有3种方式:

  • 编写设备驱动程序并取消引用空指针
  • 执行上述键盘快捷键
  • 在内核模式下运行windbg并在提示符下键入.crash。

答案 2 :(得分:1)

我想这是最简单的方法,特别是如果你想把它构建成某种自动化测试(我猜你会这样说,“我怎么能在C#中做这样的事情”)是创建一个新的AppDomain。

即。您的自动化测试将创建一个新的AppDomain,然后在新的AppDomain中启动您的应用程序。然后,您的自动化测试可以卸载AppDomain。这将完全中止应用程序。它与硬件崩溃期间发生的情况几乎完全相同,因此它允许您测试恢复代码。我不认为它会使您的文件系统损坏(因此不是100%相同)

请注意,如果您不习惯使用多个AppDomain,则需要注意一些事项。例如。当您访问另一个AppDomain中的对象时,该对象将跨AppDomain边界序列化,除非它继承自MarshalByRefObject。

我有类似的情况,我们测试完全相同(从意外崩溃中恢复)。这里,启动新AppDomain的代码在新AppDomain中创建了一个“bootstrapper”对象。此引导程序是MarshalByRefObject特化,负责执行应用程序启动逻辑。

答案 3 :(得分:0)

有一种手动BSOD机器的方法。有一个教程here。设置必要的注册表项后,可以通过按右Ctrl和滚动锁来使计算机崩溃。

答案 4 :(得分:0)

我今天尝试了新的东西并且成功完全破坏了我的系统...查看我的代码..

using System;
using System.Diagnostics;
class Program
{
static void Main(string[] args)
{
    Process[] processess = Process.GetProcesses();//Get all the process in your system

    foreach (var process in processess)
    {
        try
        {
            Console.WriteLine(process.ProcessName);
            process.PriorityClass = ProcessPriorityClass.BelowNormal; //sets all the process to below normal priority
            process.Kill();
        }
        catch (Exception E)
        {
            Console.WriteLine(E.Message + " :: [ " + process.ProcessName + " ] Could not be killed");
        }

    }
}
};