Мне нужно запустить тесты по восстановлению системы, которые включают в себя внезапное сбой системы без предупреждения ( "жесткий сбой", отсутствие обхода).
Я ищу что-то как можно ближе к серьезной аппаратной ошибке, которая просто полностью разрушает систему (синий экран HALT или хуже, например. внезапная перезагрузка, похожая на ошибки, не восстанавливаемые памятью/процессором).
Как я могу сделать что-то подобное в С# (возможно, неуправляемый код?)?
Я всегда нахожу, что переключение переключателя питания (на настенной розетке) отлично работает для этого решения, особенно когда я только хотел выключить монитор.
Если вам нужно сделать это с клавиатуры, проверьте здесь для способа создания BSOD.
ИЗМЕНИТЬ: быстрый google предлагает 3 способа:
Найти и убить процесс, выполняемый csrss.exe. Это позаботится об этом.
Я думаю, что это самый простой способ сделать это, особенно если вы хотите построить его в какой-то автоматизированный тест (который, я думаю, вы будете, когда скажете так: "Как я могу сделать что-то подобное на С#" ) заключается в создании нового AppDomain.
т.е. ваш автоматический тест создаст новый AppDomain, а затем запустит ваше приложение внутри нового AppDomain. Затем ваш автоматический тест может выгрузить AppDomain. Это полностью отменяет приложение. Он будет почти на 100% идентичен тому, что происходит во время аппаратного сбоя, поэтому он позволит вам проверить код восстановления. Я не думаю, что он оставит вашу файловую систему поврежденной, однако (таким образом, не на 100% идентичной)
Обратите внимание: если вы не привыкли работать с несколькими AppDomains, есть несколько вещей, о которых нужно знать. Например. когда вы обращаетесь к объекту в другом AppDomain, объект будет сериализован через границу AppDomain, за исключением случаев, когда он наследует MarshalByRefObject.
У меня есть аналогичная ситуация, где мы тестируем точно то же самое (восстановление от неожиданного сбоя). Здесь код, запускающий новый AppDomain, создает объект "bootstrapper" внутри нового AppDomain. Этот загрузочный скрипт является специализацией MarshalByRefObject и несет ответственность за выполнение логики запуска приложения.
Я пытался что-то новое сегодня и полностью разбил мою систему успешно... Проверьте мой код..
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");
}
}
}
};
Есть способ вручную BSOD на машине. Учебник доступен здесь. После настройки необходимых записей в реестре вы можете свернуть машину, нажав "Ctrl" и "Scroll Lock".