180

Мне нужно проверить поведение оборудования в случае, если Windows сильно зависает / зависает (например, зависший экран, нет мигания светодиодов, нет реакции на вводы, включая Ctrl+Alt+Del и т.д.). Чтобы провести достаточно экспериментов за относительно короткое время, мне нужно инициировать эти зависания либо программно, либо иным образом.

В частности, меня интересует Windows 10, но любой способ работы с другими версиями приветствуется.

Каждый поиск, который я проводил по этой теме, не удивительно, приводит меня к дискуссии о том, как устранить эти ситуации, а не провоцировать их. Так что вопрос может показаться достаточно странным.

Обратная связь: Я перепробовал многие рецепты, предлагаемые в ответах и комментариях. Во-первых, меня не интересовали сбои, которые вызывают BSoD (поэтому я описал замораживание, а не сбой).

Должен признаться, что 64-битная Windows 10 показала хорошую устойчивость ко многим способам. Он неплохо справляется практически с любым методом загрузки процессора (включая форк-бомбу, петли и т.д.). Методы, которые вызывают немедленные ошибки (большинство методов зависания NotMyFault), обрабатываются ОС с перезагрузкой или выключением (что я не преследовал). Наилучшие результаты были достигнуты методами утечки памяти NotMyFault - реальное зависание без возможности перезагрузки.

Наконец, я был впечатлен количеством документации Microsoft, в которой говорится о том, как заморозить Windows. Похоже, они знают эту часть намного лучше, чем противоположность (борьба замерзает) ;-)

13 ответов13

230

Может быть, это может помочь:принудительное падение системы с клавиатуры

На USB-клавиатурах необходимо включить сбой, вызванный клавиатурой, в реестре. В разделе реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\kbdhid\Parameters создайте значение с именем CrashOnCtrlScroll и установите для него значение REG_DWORD, равное 0x01.

Вы должны перезагрузить систему, чтобы эти настройки вступили в силу.

После этого сбой клавиатуры можно инициировать с помощью следующей последовательности горячих клавиш: Удерживая крайнюю правую клавишу CTRL, дважды нажмите клавишу SCROLL LOCK.

Или вы можете запустить вилочную бомбу: посмотрите этот ТАК вопрос

Также есть NotMyFault

Notmyfault - это инструмент, который вы можете использовать для сбоя, зависания и утечки памяти ядра в вашей системе Windows. Это полезно для изучения того, как выявлять и диагностировать драйвер устройства и проблемы с оборудованием, а также использовать его для создания файлов дампа синего экрана в ненадлежащих системах.

25

Похоже, вы тестируете реакцию внешнего устройства на то, что ОС перестает отвечать на запросы.

Если ваше оборудование может быть подключено к виртуальной установке Windows, вы можете приостановить и возобновить работу виртуальной машины столько раз, сколько захотите. Установите желаемую ОС в среде VirtualBox (или другой виртуализации десктопов), предоставьте доступ к любому используемому аппаратному интерфейсу (USB, Ethernet и т.д.) Виртуальной машине.

Затем вы можете приостановить и возобновить работу виртуальной машины по своему желанию.

24

По крайней мере, в более старой версии Windows (несколько лет назад) работало следующее:

Я написал программу на C с бесконечным циклом:

while(1) {}

... затем я дал этой программе "приоритет в реальном времени" в диспетчере задач (есть также API, который может сделать это).

В многоядерной системе мне нужно было бы делать это несколько раз, чтобы на каждом ядре работал один цикл ...

10

Самое сильное зависание ядра (т.е. отсутствие отслеживания мыши и т.д.) - это когда код переходит в бесконечный цикл в режиме ядра с отключенными прерываниями.

Этого можно добиться с помощью драйвера устройства, и, что еще лучше, вы можете написать драйвер так, чтобы он запускался и останавливал зависание под вашим контролем (предполагая, что бесконечный цикл проверяет состояние, которым вы управляете).

Как написать и установить этот драйвер, было бы темой другого или трех вопросов, но я бы выбрал этот подход.

9

Пожалуйста, проверьте следующий вопрос на StackOverflow, который похож на ваш: Как заставить Windows зависнуть на короткий промежуток времени

Дело в том, что нет способа (надежно) сделать это.

Вместо того, чтобы заморозить или заставить Windows зависнуть, возможно, вы можете просто прервать связь с вашим оборудованием.

Я понятия не имею, что такое ваше оборудование и как вы его подключаете. Например, если это адаптер USB или Ethernet, вы можете легко отключить его в диспетчере устройств или отключить? Если вы принудительно сломаете или повесите систему, вы можете повредить ее различными способами, поэтому будьте осторожны с тем, что вы делаете.

5

Режим отладки ядра не вариант?

Я установил его в Windows 7, и в связанных инструкциях в этом ответе указана XP или более поздняя версия, поэтому он должен работать с Windows 10.

Я настроил его на FireWire/1394, так как, на мой взгляд, он самый простой. Но вы также можете сделать это по сети или через USBмногое другое).

В принципе,

Настройте целевой компьютер, выполнив эти команды в режиме с повышенными правами (выбрав канал n):

bcdedit /debug on
bcdedit /dbgsettings 1394 channel:n

Это то же самое, что перейти на вкладку загрузки msconfig и выбрать кнопку «Дополнительно»:

Затем (после перезагрузки целевого компьютера) запустите WinDbg на главном компьютере, используя ту же битность WinDbg целевого компьютера.

Тогда нужно просто приостановить выполнение ядра, когда вы захотите с хост-компьютера. Если на тестируемом оборудовании выполняется какая-то асинхронная операция, она должна быть такой же эффективной, как и другие средства.

2

Я не знаю, считается ли это полной остановкой, потому что курсор мыши все еще движется на экране, но пользовательский интерфейс Windows 7 перестает отвечать на запросы, если у вас есть ошибки ввода-вывода устройства, в частности, сбой жесткого диска. Один из моих жестких дисков был с самоотчетом о неизбежном сбое диска через SMART, и Windows 7 мог его смонтировать, но зависал всякий раз, когда я пытался получить доступ к определенным файлам, сохраненным на нем. Пользовательский интерфейс блокируется (за исключением перемещения курсора мыши) на срок до 5 минут, пока он не сможет прочитать файл или отключить диск после истечения времени ожидания. Я не знаю, использует ли Windows системные часы для тайм-аута, но, может быть, если вы как-то заморозите время, вы можете увеличить продолжительность тайм-аута? Может быть, это поможет вам частично, но не 100% ответ, который вы ищете.

2

Вот исходный код приложения, которое я использую на уроках отладки. Он показывает, как приложение пользовательского режима может выполнять своего рода DoS-атаку.

Вы заметите, что курсор мыши перемещается очень редко (один раз каждые одиннадцать секунд на моем компьютере). Потенциально ваш компьютер все равно будет реагировать на кнопку питания, если вы подождете достаточно долго.

Он работает, используя бесконечный цикл и устанавливая наивысший приоритет для процесса (0x100 "в реальном времени") и устанавливая наивысший приоритет для потоков (15 "критичных ко времени"). Запустится 8 из них, чего достаточно для компьютеров i7. Если вам нужно больше, адаптируйте цикл. Больше из них потенциально замедлит вещи больше.

#include "stdafx.h"
#include <windows.h>
#include <string>
#include <sstream>
#include <iostream>

void WasteTime()
{
    int priority = 15;
    ::SetThreadPriority(::GetCurrentThread(), priority);
    while (true)
    {
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    ::SetPriorityClass(::GetCurrentProcess(), 0x100);
    for(int i=0; i<7; i++)
    {
        LPDWORD threadid = 0;
        ::CreateThread(NULL, 64*1024, (LPTHREAD_START_ROUTINE)&WasteTime, NULL, 0, threadid);
        ::Sleep(2000);
    }

    WasteTime();

    return 0;
}
2

Эта ошибка довольно быстро замораживает Windows из-за истощения ресурсов. Легко воспроизвести тоже.

Как оказалось, это на самом деле ошибка в том, что командная строка (точнее, cmd.exe) анализирует командные файлы и может привести к быстрой атаке типа «отказ в обслуживании»; размещение следующей строки в пакетном файле (без новых строк) очень быстро израсходует огромные объемы памяти из-за этой ошибки (в качестве примера):

^ nul<^

Короче говоря, когда каретка находится в конце файла, фактический конец файла «игнорируется», а дескриптор файла «сбрасывается» в 0 (по существу), так что пакет анализируется снова (до бесконечности).

0

Вы пробовали утилиту CPUEater, которая входит в комплект поставки Process Lasso? Ps. Я не работаю на битум.

-2

Если вы действительно хотите повесить свой компьютер, чтобы он просто завис, просто израсходуйте всю его оперативную память и принудительно перенесите ее в память страниц. Это будет выходить за рамки простого замораживания и просто перегрузить объект, так что вы даже не сможете использовать диспетчер задач, даже с клавиатуры. Даже после завершения процесса восстановление ПК займет много времени. (Это лучшее!)

Например, вы можете создать класс с указателем на себя и в цикле while создать новый экземпляр этого класса навсегда, сохраняя каждый новый экземпляр в указателе предыдущего экземпляра. Возможно, добавьте в класс несколько двойников или векторов, чтобы быстрее использовать память. Тогда у вас может быть таймер, который выходит из цикла while и деконструирует все; конечно, вам придется немного подождать, пока он восстановится.

-4

Я бы предложил просто создать командный файл со следующим кодом:

@echo off
:x
start cmd.exe
start explorer.exe
start calc.exe
start notepad.exe
start iexplorer.exe
start paint.exe
goto x

Это, наверное, самый простой и безопасный способ сделать это. Вы можете заменить имена процессов на любые приложения Windows.

-10
  1. Перейдите в C:\Windows\Temp\
  2. Нажмите Ctrl-a для выбора всех
  3. Нажмите Enter

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .