我需要对系统可恢复性进行测试,包括突然崩溃系统而不发出警告(“硬崩溃”,没有关机解决方法)。
我正在寻找尽可能接近完全崩溃系统的严重硬件错误(蓝屏HALT或更糟,例如.sudden reboot类似于不可恢复的内存/ CPU错误)。
我怎么能在C#中做这样的事情(可能是非托管代码?)?
答案 0 :(得分:2)
查找并终止运行csrss.exe的进程。这将照顾它。
答案 1 :(得分:2)
我总是发现翻转电源开关(在墙上插座上)可以完美地用于此解决方案 - 特别是当我只想关闭显示器时。
如果您需要通过键盘进行操作,请检查here以获取生成BSOD的方法。
编辑:快速谷歌建议有3种方式:答案 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");
}
}
}
};