Come posso provocare il blocco di Windows (blocco)?


180

Ho bisogno di testare il comportamento attrezzature nel caso in cui di Windows duri si blocca / blocca (ad esempio schermo congelato, nessun LED lampeggianti, nessuna reazione agli ingressi, tra cui Ctrl + Alt + Canc , etc.). Per avere abbastanza esperimenti in un tempo ragionevolmente breve, devo iniziare questi blocchi in modo programmatico o meno.

Sono interessato a Windows 10 in particolare, ma ogni modo di lavorare per altre versioni è apprezzato.

Ogni ricerca che ho fatto su questo argomento non sorprendentemente mi porta a discussioni su come eliminare queste situazioni, non provocarle. Quindi la domanda può sembrare abbastanza strana.

Feedback: ho provato molte delle ricette offerte in risposte e commenti. Prima di tutto, non ero interessato agli arresti anomali che causano BSoD (ecco perché ho descritto un blocco, non un arresto anomalo).

Devo confessare che Windows 10 a 64 bit ha mostrato una buona resistenza in molti modi. Gestisce abbastanza bene quasi tutti i metodi di caricamento della CPU (inclusi fork-bomb , loop, ecc.). I metodi che generano errori immediati (la maggior parte dei metodi di blocco NotMyFault) sono gestiti dal sistema operativo con riavvio o arresto (che non è quello che ho perseguito). I risultati migliori sono stati ottenuti con i metodi di perdita di memoria di NotMyFault : blocco reale senza possibilità di riavvio.

Infine, sono rimasto colpito dalla quantità di documentazione di Microsoft che parla del congelamento di Windows. Sembra che conoscano questa parte molto meglio del contrario (combattere i blocchi) ;-)


I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat .
DavidPostill

3
C'è un calcolo che potresti fare usando la calcolatrice, che congela il core sulla CPU fino a quando non lo completa. Su una macchina quad core lo faresti ovviamente quattro volte. Ma non posso ricordare per la vita di me l'equazione matematica che la causa.
mickburkejnr,

6
@mickburkejnr È fattoriale di 100000. Passare a "Visualizzazione scientifica" digitare 100000 e premere "n!". Questo ha funzionato bene su vecchie versioni di Windows. Al giorno d'oggi riceverai un avviso sul fatto che questo calcolo potrebbe richiedere molto tempo e puoi annullarlo.
duenni

25
Inizia a usarlo.
samazi

5
L'installazione degli aggiornamenti ha sempre funzionato per me.
Daniel R Hicks,

Risposte:


230

Forse questo può essere d'aiuto: forzare un crash di sistema dalla tastiera

Con le tastiere USB, è necessario abilitare l'arresto anomalo avviato dalla tastiera nel registro. Nella chiave di registro HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Services \ kbdhid \ Parameters, crea un valore chiamato CrashOnCtrlScroll e impostalo uguale a un valore REG_DWORD di 0x01.

È necessario riavviare il sistema affinché queste impostazioni abbiano effetto.

Al termine, è possibile avviare l'arresto anomalo della tastiera utilizzando la seguente sequenza di tasti di scelta rapida: tenere premuto il tasto CTRL più a destra e premere due volte il tasto BLOC SCORR.

Oppure potresti avviare una bomba a forcella: vedi questa domanda SO

C'è anche NotMyFault

Notmyfault è uno strumento che puoi usare per bloccare, bloccare e causare perdite di memoria del kernel sul tuo sistema Windows. È utile per imparare a identificare e diagnosticare i problemi di driver di dispositivo e hardware e puoi anche usarlo per generare file di dump della schermata blu su sistemi che si comportano male.


9
Ho provato ForkBomb e NotMyFault. Uno dei metodi di perdita sembra fare quello che voglio. Altri non sono utili in quanto portano a riavviare / arrestare non congelare. Molte grazie.
ipera il

6
CtrlScroll ti offre un BSOD. Se questo congela il sistema per il debug o semplicemente lo riavvia, dipende dalle impostazioni di avvio.
Grawity,

51
Aaannnddd duenni non è mai permesso vicino ai miei computer. Mai.
corsiKa

25

Sembra che tu stia testando la reazione di un dispositivo esterno a un sistema operativo che non risponde.

Se il tuo hardware può essere collegato a un'installazione Windows virtualizzata, puoi mettere in pausa e riprendere la macchina virtuale tutte le volte che vuoi. Installare il sistema operativo desiderato in un ambiente VirtualBox (o altra virtualizzazione desktop), esporre qualsiasi interfaccia hardware utilizzata (USB, Ethernet o altro) alla VM.

È quindi possibile mettere in pausa e riprendere la macchina virtuale a piacimento.


24

Almeno in una versione precedente di Windows (alcuni anni fa) funzionava quanto segue:

Ho scritto un programma C con un ciclo infinito:

while(1) {}

... poi ho dato a quel programma "priorità in tempo reale" nel task manager (c'è anche un'API che può farlo).

Su un sistema multi-core avrei bisogno di farlo più volte, quindi un loop è in esecuzione su ciascun core ...


39
Per riscaldare la CPU meno mentre si fa che: mettere _mm_pause()da #include <immintrin.h>nel ciclo. Questa è un'istruzione hardware della CPU, non una chiamata di sistema "sleep" di qualsiasi tipo; per quanto riguarda il sistema operativo, il processo è indistinguibile da SuperPI; la differenza sta proprio nella quantità di energia consumata dalla CPU durante l'esecuzione del loop.
Peter Cordes,

5
Non sono sicuro se ciò impedisce alle parti in modalità kernel di Windows di funzionare.
CodesInCos

2
@CodesInChaos: la maggior parte dei thread del kernel viene eseguita con priorità normale. Uno di questi per CPU e kernel è praticamente fatto.
Joshua,

Un'altra assemblea tecnica che coinvolge 86 ( STI+ HLT): stackoverflow.com/questions/3747847/...
meklarian

3
@meklarian: Dovrebbe essere CLI; HLT. Presumibilmente, però, devi farlo dalla modalità privilegiata. In linea di principio può ancora essere salvato da NMI o simili.
Nate Eldredge,

10

Il blocco più forte del kernel (cioè, nessun tracciamento del mouse, ecc.) È quando il codice entra in un ciclo infinito in modalità kernel con interruzioni disattivate.

È possibile raggiungere questo obiettivo con un driver di dispositivo e, ancora meglio, è possibile scrivere il driver in modo che inizi e blocchi l'arresto sotto il tuo controllo (supponendo che il ciclo infinito stia testando la condizione che hai il controllo).

Come scrivere e installare questo driver sarebbe l'argomento di un'altra o tre domande, ma questo è l'approccio che prenderei.


9

Controlla la seguente domanda su StackOverflow che è simile alla tua: Come bloccare Windows per un breve periodo di tempo

Il fatto è che non c'è modo di farlo (in modo affidabile).

Invece di bloccare o far bloccare Windows, forse puoi semplicemente interrompere la comunicazione con la tua attrezzatura.

Non ho idea di quale sia la tua attrezzatura e come la colleghi. Se si tratta di un adattatore USB o Ethernet, ad esempio, potresti facilmente disattivarlo in Gestione dispositivi o scollegare? Se si blocca o si blocca forzatamente il sistema, è possibile che si danneggi il sistema in vari modi, quindi fare attenzione a ciò che si fa.


1
Prenderò in considerazione la disconnessione fisica dell'apparecchiatura se non sono soddisfatto dei risultati del software. Grazie.
ipera il

5

La modalità debug del kernel non è un'opzione?

L'ho installato in Windows 7 e le istruzioni collegate in questa risposta specificano XP o versioni successive, quindi dovrebbe funzionare con Windows 10.

L'ho installato su FireWire / 1394 , dal momento che è il più semplice, secondo me. Ma puoi anche farlo tramite la rete o USB (e altro ).

Fondamentalmente,

Installa il computer di destinazione eseguendo questi comandi in un prompt elevato (selezionando un canale n):

bcdedit /debug on
bcdedit /dbgsettings 1394 channel:n

Ciò equivale a accedere alla scheda di avvio di msconfige selezionare il pulsante "Avanzate":

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

Quindi (dopo aver riavviato il computer di destinazione), eseguire WinDbg sul computer host utilizzando lo stesso testimone di WinDbg del computer di destinazione.

Quindi è solo una questione di mettere in pausa l'esecuzione del kernel ogni volta che vuoi dal computer host. Se l'apparecchiatura di prova esegue un'operazione asincrona in esecuzione, ciò dovrebbe essere efficace come altri mezzi.


Modo interessante Però ha bisogno di un secondo PC. Ma proverò quando possibile.
ipera il

2

Non so se questo si qualifica come un blocco totale perché il cursore del mouse si sposta ancora sullo schermo, ma l'interfaccia utente di Windows 7 non risponde se si verificano errori di I / O del dispositivo, in particolare un errore del disco rigido. Uno dei miei dischi rigidi era un errore imminente di auto-segnalazione tramite SMART e Windows 7 lo montava ma si bloccava ogni volta che provavo ad accedere ad alcuni file salvati su di esso. L'interfaccia utente si bloccherebbe (ad eccezione del movimento del cursore del mouse) per un massimo di 5 minuti fino a quando non fosse in grado di leggere il file o di smontare l'unità dopo il timeout. Non so se Windows utilizza l'orologio di sistema per il timeout, ma forse se in qualche modo si congela il tempo è possibile estendere la durata del timeout? Forse questo ti porterà a metà strada, ma non al 100% la risposta che stai cercando.


2

Questo bug blocca Windows abbastanza rapidamente a causa dell'esaurimento delle risorse. Anche facile da riprodurre.

A quanto pare, questo è in realtà un bug nel modo in cui la riga di comando (più specificamente cmd.exe) analizza i file batch e potrebbe portare a un rapido attacco di tipo denial of service; l'inserimento della seguente riga in un file batch (senza nuove righe) consumerà enormi quantità di memoria molto rapidamente a causa di questo errore (ad esempio):

^ nul<^

Per farla breve, quando un punto di inserimento si trova alla fine del file, la fine effettiva del file viene "ignorata" e il file gestisce "reimpostato" su 0 (essenzialmente) in modo che il batch venga nuovamente analizzato (all'infinito).


2

Ecco il codice sorgente di un'applicazione che utilizzo nelle mie lezioni di debug. Mostra come un'applicazione in modalità utente può eseguire una sorta di attacco DoS.

Noterai che il cursore del mouse si sposta molto raramente (una volta ogni undici secondi sulla mia macchina). Potenzialmente il tuo PC reagirà comunque al pulsante di accensione se aspetti abbastanza a lungo.

Funziona utilizzando un ciclo infinito e impostando la massima priorità per il processo ( 0x100"tempo reale") e impostando la massima priorità per i thread ( 15"tempo critico"). Ne cominceranno 8, che è sufficiente per i computer i7. Se hai bisogno di più, adatta il loop. Molti di loro potenzialmente rallenteranno di più le cose.

#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;
}

Attenzione che questo programma ha un comportamento indefinito in C ++, quindi in certe impostazioni di ottimizzazione il compilatore potrebbe sostituire il tutto conExitProcess(0)
Ben Voigt,

@BenVoigt In tal caso (cioè con g++) se -O0non bastasse, forse gcc -Q -O0 --help=optimizers | grep enabled (e disabilitando l'ottimizzazione sopravvissuta a mano) potrebbe essere possibile risolvere il ExitProcess(0)problema?
Hastur,

@BenVoigt: potresti elaborare quale parte considera un comportamento indefinito?
Thomas Weller,

@BenVoigt IMHO il compilatore può solo ottimizzare l' return 0istruzione, perché esiste dopo il while(true). Il compilatore potrebbe scoprire che si tratta di un'istruzione irraggiungibile.
Thomas Weller,

Il linguaggio C ++ richiede che ogni thread alla fine faccia progressi, definito in termini di diversi tipi di comportamento osservabile. Poiché il ciclo infinito non fa mai progressi osservabili, il compilatore può dedurre che non viene raggiunto e rimuoverlo non solo, ma tutto il codice sopra di esso torna al ramo più vicino.
Ben Voigt,

0

Hai provato l' utilità CPUEater in bundle con Process Lasso? Ps. Non lavoro per bitsum.


Penso che intendi "Hai provato", non "Hai provato". :)
fabspro,

@fabspro Penso che "Hai provato" sia corretto perché l'OP ha già accettato un'altra risposta, quindi l'evento a cui mi riferisco ("risoluzione del problema") è in passato, ma si potrebbe probabilmente dire che Internet sta sempre accadendo. Comunque, se suggerisci una modifica, delegherò volentieri il compito di accettarla nella coda di revisione. Fonte: englishforums.com/English/HaveYouTriedOrDidYouTry/zclxb/...
beppe9000

Immagino che se avesse risolto il problema, la tua inchiesta avrebbe potuto essere un commento sulla sua risposta allora - qualcosa come "quando stavi cercando il tuo problema, era una delle cose che hai provato _______ utility?" forse ...
sto

... touché :)
beppe9000

huehuehuehuehue
fabspro

-2

Se vuoi davvero appendere il tuo PC, causandone il blocco , basta utilizzare tutta la sua RAM e forzarlo nella memoria della pagina. Questo andrà oltre il semplice congelamento e sovraccaricherà davvero la cosa in modo tale che non puoi nemmeno usare Task Manager, nemmeno con la tastiera. Anche quando il processo è terminato, il PC impiegherà molto tempo a recuperare. (È il migliore!)

Ad esempio, è possibile creare una classe con un puntatore a se stessa e, in un ciclo while, creare una nuova istanza di quella classe per sempre, memorizzando ogni nuova istanza nel puntatore dell'istanza precedente. Magari aggiungi anche dei doppi o vettori alla classe, per consumare memoria più rapidamente. Quindi potresti avere un timer che esce dal ciclo while e decostruisce tutto; ovviamente, dovrai aspettare un po 'per recuperare.


-4

Suggerirei semplicemente di creare un file batch con il seguente codice:

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

Questo è probabilmente il modo più semplice e sicuro per farlo. È possibile sostituire i nomi dei processi con qualsiasi applicazione Windows.


3
Molto probabilmente questo esaurirà la RAM e causerà il blocco del disco rigido. A seconda delle specifiche del tuo computer, è possibile che il computer continui a funzionare in questo modo, soprattutto perché 4 di quei programmi elencati sono abbastanza leggeri ( iexplore.exee forse explorer.exeavrebbero un impatto maggiore). Ucciderà automaticamente i processi di hogging della memoria automaticamente.
MoonRunestar,

-10
  1. Vai a C: \ Windows \ Temp \
  2. Premi Ctrl-a per Seleziona tutto
  3. Premi Invio

8
Avresti bisogno di molte migliaia di articoli perché questo sia vagamente efficace! La mia cartella% TEMP% è vuota ...
AlainD,

6
Anche se questo sembra essere un tentativo legittimo di rispondere alla domanda, non è del tutto chiaro come ciò dovrebbe comportare il blocco di Windows come richiesto dall'OP. Si prega di modificare la tua domanda per spiegare perché questo farà quello che l'OP vuole.
Twisty Impersonator,

9
Mi dispiacerebbe per chiunque abbia provato questo e non si sia reso conto di essere stato colpito da download drive-by con software dannoso lì dentro.
MoonRunestar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.