題 如何激活Windows掛起(凍結)?


我需要在Windows的情況下測試設備行為  掛起/凍結(例如凍結屏幕,沒有LED閃爍,對輸入沒有反應,包括 按Ctrl + Alt + Del鍵等)。為了在合理的短時間內進行足夠的實驗,我需要以編程方式或其他方式啟動這些掛起。

我對感興趣 Windows 10 特別是,但其他版本的任何工作方式表示讚賞。

我在這個主題上所做的每一次搜索都不足為奇地讓我討論如何進行討論 消除 這些情況,不會激怒他們。所以這個問題可能看起來很奇怪。

反饋: 我嘗試了很多 食譜 在答案和評論中提供。首先,我對帶來BSoD的崩潰不感興趣(這就是為什麼我描述了凍結,而不是崩潰)。

我必須承認,Windows 10 64位顯示出對許多方式的良好抵抗。它幾乎可以應對任何問題 CPU負載 方法(包括 叉炸彈,循環等)很好。引發即時錯誤的方法(大多數NotMyFault掛起方法)由操作系統通過重啟或關閉來處理(這不是我所追求的)。最好的結果是通過 內存洩漏 的方法 不是我的錯  - 真正的凍結,沒有重啟的機會。

最後,我對微軟的文檔數量印象深刻,該文檔涉及使Windows凍結。看起來他們比對面知道這部分要好得多(戰鬥凍結);-)


180
2017-11-02 08:03


起源


評論不適用於擴展討論;這次談話已經開始了 轉移到聊天。 - DavidPostill♦
您可以使用計算器進行計算,計算器會凍結CPU上的核心,直到完成它為止。在四核機器上你顯然會做四次。但我不能為我的生活記住造成它的數學方程式。 - mickburkejnr
@mickburkejnr它的因子為100000.切換到“科學視圖”類型100000並按“n!”。這在舊的Windows版本上運行良好。現在你會收到一個警告,說這個計算可能需要很長時間,你可以取消它。 - duenni
剛開始使用它。 - samazi
安裝升級總是對我有用。 - Daniel R Hicks


答案:


也許這可以幫助: 從鍵盤強制系統崩潰

使用USB鍵盤,您必須啟用鍵盤啟動的崩潰   註冊表。在註冊表項中   HKEY_LOCAL_MACHINE \系統\ CurrentControlSet \服務\ kbdhid \參數,   創建一個名為CrashOnCtrlScroll的值,並將其設置為等於a   REG_DWORD值為0x01。

您必須重新啟動系統才能使這些設置生效。

完成此操作後,可以使用啟動鍵盤崩潰   以下熱鍵序列:按住最右邊的CTRL鍵,然後按   按兩次SCROLL LOCK鍵。

或者你可以開始一個叉炸彈: 看到這個問題

還有 不是我的錯

Notmyfault是一個可用於崩潰,掛起並導致Windows系統內核內存洩漏的工具。它對於學習如何識別和診斷設備驅動程序和硬件問題非常有用,您還可以使用它在行為不當的系統上生成藍屏轉儲文件。


230
2017-11-02 08:29



試過ForkBomb和NotMyFault。洩漏方法之一似乎做我想要的。其他沒有用,因為他們帶來重啟/關閉不凍結。非常感謝。 - hypers
CtrlScroll帶給你一個BSOD。是否凍結系統進行調試或僅重新啟動它取決於啟動設置。 - grawity
Aaannnddd duenni從未被允許靠近我的電腦。永遠。 - corsiKa


聽起來你正在測試外部設備對操作系統反應遲鈍的反應。

如果您的硬件可以連接到虛擬化Windows安裝,則可以根據需要多次暫停和恢復虛擬機。在VirtualBox(或其他桌面虛擬化)環境中安裝所需的操作系統,將正在使用的任何硬件接口(USB,以太網或其他)暴露給VM。

那你可以 暫停和恢復 虛擬機隨意。


25
2017-11-05 03:16





至少在較舊的Windows版本(幾年前)下,以下工作:

我寫了一個無限循環的C程序:

while(1) {}

...然後我在任務管理器中給了該程序“實時優先級”(還有一個可以執行此操作的API)。

在多核系統上,我需要多次執行此操作,以便在每個核心上運行一個循環...


24
2017-11-02 11:55



在這樣做時減少加熱你的CPU:put _mm_pause() 從 #include <immintrin.h> 在循環。這是一個CPU硬件指令,而不是任何類型的“睡眠”系統調用;就操作系統而言,您的流程與SuperPI無法區分;區別在於運行循環時CPU消耗的功率。 - Peter Cordes
我不確定是否會阻止Windows的內核模式部分工作。 - CodesInChaos
@CodesInChaos:大多數內核線程以正常優先級運行。每個CPU和內核中的一個也完成了。 - Joshua
涉及x86組裝的另一種技術(STI + HLT): stackoverflow.com/questions/3747847/... - meklarian
@meklarian:應該是 CLI; HLT。不過,大概你必須從特權模式做到這一點。原則上它仍然可以由NMI或類似物質拯救。 - Nate Eldredge


最強的內核掛起(即沒有鼠標跟踪等)是代碼在內核模式下進入無限循環而中斷關閉的時候。

使用設備驅動程序可以實現這一點,甚至更好,您可以編寫驅動程序,以便它在您的控制下啟動和停止掛起(假設無限循環正在測試您控制的條件)。

如何編寫和安裝此驅動程序將是另一個或三個問題的主題,但這是我採取的方法。


10
2017-11-03 19:26





請檢查StackOverflow上的以下問題,該問題與您的類似: 如何讓窗戶在短時間內凍結

它的博士是沒有辦法(可靠地)做到這一點。

可能只是中斷與設備的通信,而不是凍結或讓Windows掛起。

我不知道你的設備是什麼以及你如何連接它。如果它是USB或以太網適配器,例如,您可以在設備管理器中輕鬆停用它或拔掉電源插頭?如果您強行崩潰或掛起系統,可能會以各種方式損壞您的系統,因此請小心操作。


9
2017-11-02 08:15



如果我對軟件結果不滿意,我會考慮設備的物理斷開。謝謝。 - hypers


內核調試模式不是一個選項嗎?

我在Windows 7中進行了設置,此答案中的鏈接指令指定XP或更高版本,因此它應該適用於Windows 10。

我有 通過FireWire / 1394進行設置,在我看來,這是最簡單的。但你也可以 通過網絡做到這一點 要么 USB (和 更多)。

基本上,

通過在提升的提示符中運行這些命令來設置目標計算機(選擇一個通道 n):

bcdedit /debug on
bcdedit /dbgsettings 1394 channel:n

這與進入啟動選項卡相同 msconfig,然後選擇“高級”按鈕:

enter image description here

enter image description here

然後(重新啟動目標計算機後),使用與目標計算機相同的WinDbg位數在主機上運行WinDbg。

然後,只需要在主機上暫停內核執行即可。如果測試設備有一些正在運行的異步操作,這應該和其他方法一樣有效。


5
2017-11-08 19:47



有趣的方式。雖然需要第二台PC。但會盡可能嘗試。 - hypers


我不知道這是否有資格作為完全凍結,因為鼠標光標仍在屏幕上移動,但如果您有設備I / O錯誤更具體地說是硬盤驅動器故障,則Windows 7 UI會變得無法響應。我的一個硬盤驅動器是通過SMART自動報告即將發生的驅動器故障,而Windows 7將安裝它,但每當我嘗試訪問保存在其上的某些文件時它就會掛起。 UI將鎖定(除了鼠標光標移動)最多5分鐘,直到它可以讀取文件或在超時後卸載驅動器。我不知道Windows是否使用系統時鐘進行超時,但是如果你以某種方式凍結延長超時長度的時間呢?也許這會讓你分道揚but,但不是100%你正在尋找的答案。


2
2017-11-03 13:52





這個bug 由於資源耗盡,很快就凍結了Windows。易於重現。

事實證明,這實際上就是這樣 一個   竊聽器   在命令行中如何(更具體地說 cmd.exe)解析批處理   文件並可能導致快速拒絕服務類型攻擊;把   將使用批處理文件中的以下行(沒有新行)   由於這個錯誤,很快就會產生大量的內存   例):

^ nul<^

長話短說,當插入符號位於文件末尾時,實際   文件結尾被“忽略”,文件句柄“重置”為0   (基本上)以便再次解析批次(無限廣告)。


2
2017-11-08 13:57





這是我在調試課程中使用的應用程序的源代碼。它顯示了用戶模式應用程序如何執行某種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
2017-11-08 18:22



請注意,此程序在C ++中具有未定義的行為,因此在某些優化設置下,編譯器可以替換整個事物 ExitProcess(0) - Ben Voigt
@BenVoigt在那種情況下(即帶有 g++)如果 -O0 可能還不夠 gcc -Q -O0 --help=optimizers | grep enabled  (並且用手禁用倖存的優化)可以解決問題 ExitProcess(0) 問題? - Hastur
@BenVoigt:你能詳細說明,你認為哪一部分是未定義的行為? - Thomas Weller
@BenVoigt恕我直言編譯器只能優化 return 0 聲明,因為之後存在 while(true)。編譯器可以發現這是一個無法訪問的語句。 - Thomas Weller
C ++語言要求每個線程最終取得進展,根據幾種類型的可觀察行為進行定義。因為無限循環永遠不會產生可觀察的進展,所以編譯器可以推斷它沒有到達,並且不僅刪除它,而且將其上面的所有代碼都移回到最近的分支。 - Ben Voigt


你試過嗎? CPUEater 效用 與Process Lasso捆綁在一起? PS。我不為bitum工作。


0
2017-11-12 18:41



我認為你的意思是“你試過”,而不是“你試過嗎”。 :) - fabspro
@fabspro我認為“你試過”是正確的,因為OP已經接受了另一個答案,所以我所指的事件(“解決問題”)已經過去,但人們可能會說互聯網總是在發生。無論如何,如果你建議編輯,我很樂意將接受它的任務委託給審查隊列。資源: englishforums.com/English/HaveYouTriedOrDidYouTry/zclxb/... - beppe9000
我想如果他已經解決了這個問題,那麼你的詢問可能就是對他答案的評論 - 比如“當你研究你的問題時,是你試過的事情之一_______實用程序?”也許......只是暗示事情:) - fabspro
... 德勤 :) - beppe9000
huehuehuehuehue - fabspro