如何引起Windows挂起(冻结)?


180

在Windows 挂/冻结的情况下(例如冻结的屏幕,没有LED闪烁,对输入(包括Ctrl + Alt + Del等)没有反应),我需要测试设备的行为。为了在合理的短时间内进行足够的实验,我需要以编程方式或其他方式启动这些挂起。

我特别对Windows 10感兴趣,但是对其他版本的任何工作方式都表示赞赏。

毫不奇怪,我在该主题上进行的每一次搜索都使我开始讨论如何消除这些情况,而不是引起它们。因此,这个问题似乎很奇怪。

反馈: 我已经尝试了答案和评论中提供的许多食谱。首先,我对带来BSoD的崩溃不感兴趣(这就是为什么我描述了冻结而不是崩溃)。

我必须承认,Windows 10 64位在许多方面都表现出良好的抵抗力。它可以很好地处理几乎所有的CPU加载方法(包括fork-bomb,loops等)。引发立即错误的方法(大多数NotMyFault挂起方法)由操作系统通过重新引导或关闭进行处理(这不是我所追求的)。最好的结果是通过NotMyFault内存泄漏方法获得的-真正的冻结,没有重新启动的机会。

最终,微软对有关冻结Windows的大量文档给我留下了深刻的印象。看来他们比对面的人更了解这一部分(战斗冻结);-)


评论不作进一步讨论;此对话已转移至聊天
DavidPostill

3
您可以使用计算器进行计算,该计算会冻结CPU上的内核,直到完成为止。在四核计算机上,您显然要做四次。但是我无法终生记住导致它的数学方程式。
mickburkejnr

6
@mickburkejnr阶乘为100000。切换到“科学视图”类型100000并按“ n!”。这在旧的Windows版本上效果很好。如今,您会收到一条警告,指出此计算可能需要很长时间,您可以取消它。
duenni

25
刚开始使用它。
samazi

5
安装升级总是对我有用。
Daniel R Hicks

Answers:


230

也许会有所帮助: 从键盘强制系统崩溃

对于USB键盘,必须在注册表中启用键盘启动的崩溃。在注册表项HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Services \ kbdhid \ Parameters中,创建一个名为CrashOnCtrlScroll的值,并将其设置为等于REG_DWORD值0x01。

您必须重新启动系统才能使这些设置生效。

完成此操作后,可以使用以下热键顺序启动键盘崩溃:按住最右边的CTRL键,然后按两次SCROLL LOCK键。

或者,您可以发动叉子炸弹:看到这个问题

也有NotMyFault

Notmyfault是可用于崩溃,挂起并导致Windows系统上的内核内存泄漏的工具。这对于学习如何识别和诊断设备驱动程序和硬件问题很有用,您还可以使用它在行为异常的系统上生成蓝屏转储文件。


9
尝试了ForkBomb和NotMyFault。一种泄漏方法似乎可以满足我的要求。其他的则没有用,因为它们会重新启动/关闭而不冻结。非常感谢。
hypers

6
CtrlScroll带给您BSOD。是否冻结系统以进行调试还是仅重新引导系统取决于启动设置。
grawity

51
切勿在我的计算机旁允许Aaannnddd Duenni。曾经
corsiKa

25

听起来您正在测试外部设备对操作系统无响应的反应。

如果您的硬件可以连接到虚拟化的Windows安装,则可以根据需要暂停和恢复虚拟机多次。在VirtualBox(或其他桌面虚拟化)环境中安装所需的OS,将正在使用的任何硬件接口(USB,以太网或其他)暴露给VM。

然后您可以随意暂停和恢复虚拟机。


24

至少在较旧的Windows版本(几年前)下,以下各项有效:

我写了一个无穷循环的C程序:

while(1) {}

……然后我在任务管理器中为该程序提供了“实时优先级”(还有一个API可以做到这一点)。

在多核系统上,我需要多次执行此操作,以便每个核都运行一个循环...


39
在执行此操作时,要减少CPU的温度:_mm_pause()#include <immintrin.h>循环中放入。那是CPU硬件指令,而不是任何形式的“睡眠”系统调用。就操作系统而言,您的过程与SuperPI并无区别。不同之处仅在于运行循环时CPU消耗了多少功率。
彼得·科德斯

5
我不确定这是否会使Windows的内核模式部分停止工作。
CodesInChaos

2
@CodesInChaos:大多数内核线程以正常优先级运行。每个CPU和内核中的其中之一也已完成。
约书亚

涉及x86汇编(STI+ HLT)的另一种技术:stackoverflow.com/questions/3747847/…–
meklarian

3
@meklarian:应该是CLI; HLT。不过,大概您必须从特权模式执行此操作。原则上,它仍然可以由NMI或类似机构营救。
Nate Eldredge

10

最强的内核挂起(即,没有鼠标跟踪等)是代码在内核模式下进入无限循环且中断已关闭的情况。

可以使用设备驱动程序来实现此目的,甚至更好的是,可以编写驱动程序以使其在您的控制下启动和停止挂起(假设无限循环正在测试您控制的情况)。

如何编写和安装该驱动程序将是另一个问题或三个问题,但这是我要采用的方法。


9

请在StackOverflow上检查与您类似的以下问题:如何使Windows在短时间内冻结

tl; dr是没有办法(可靠地)做到这一点。

可以冻结与设备的通信,而不是冻结或挂起Windows。

我不知道您的设备是什么以及如何连接。例如,如果是USB或以太网适配器,则可以轻松地在“设备管理器”中将其停用或拔出插头?如果强行使系统死机或挂起,则可能会以各种方式损坏系统,因此请谨慎操作。


1
如果对软件结果不满意,我将考虑物理断开设备连接。谢谢。
hypers

5

内核调试模式不是一种选择吗?

我已在Windows 7中进行了设置,并且此答案中的链接说明指定了XP或更高版本,因此它应与Windows 10兼容。

我认为它是通过FireWire / 1394设置的,因为它是最简单的。但是,您也可以通过网络USB(以及更多)进行操作。

基本上,

通过在提升的提示符下运行这些命令来设置目标计算机(选择一个通道n):

bcdedit /debug on
bcdedit /dbgsettings 1394 channel:n

与转到的启动标签msconfig,然后选择“高级”按钮相同:

在此处输入图片说明

在此处输入图片说明

然后(在重新启动目标计算机之后),使用与目标计算机相同的WinDbg位在主机上运行WinDbg。

然后,只要您需要从主机上暂停内核执行就可以了。如果测试设备具有某种正在运行的异步操作,则这应与其他方法一样有效。


有趣的方式。需要第二台PC。但是会尽可能尝试。
hypers

2

我不知道这是否完全冻结,因为鼠标光标仍在屏幕上移动,但是如果您遇到设备I / O错误(尤其是硬盘驱动器故障),Windows 7 UI将变得无响应。我的硬盘驱动器之一是通过SMART自报告即将发生的驱动器故障,Windows 7会挂载它,但是每当我尝试访问保存在其中的某些文件时挂起。UI将最多锁定5分钟(鼠标光标移动除外),直到超时后它可以读取文件或卸下驱动器为止。我不知道Windows是否使用系统时钟作为超时时间,但是也许您是否以某种方式冻结时间可以延长超时时间?也许这会帮助您实现目标,但并非100%都是您要找的答案。


2

由于资源耗尽,此错误很快冻结了Windows。也容易复制。

事实证明,这实际上 命令行(更具体而言cmd.exe)如何解析批处理文件中的错误,并可能导致快速拒绝服务类型攻击。由于此错误(例如),将以下行放入批处理文件中(没有新行)将很快消耗大量内存:

^ nul<^

长话短说,当插入符号位于文件末尾时,文件的实际末尾将被“忽略”,并且文件句柄将“重置”为0(基本上),以便再次解析该批处理(无限次)。


2

这是我在调试课程中使用的应用程序的源代码。它显示了用户模式应用程序如何执行某种DoS攻击。

您会注意到,鼠标光标很少移动(在我的计算机上每隔11秒钟移动一次)。如果等待足够长的时间,您的PC可能仍会在电源按钮上做出反应。

它使用无限循环,并为进程设置最高优先级(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;
}

请注意,该程序在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

0

您是否尝试过与Process Lasso捆绑在一起的CPUEater实用程序附言 我不为沥青工作。


我认为您的意思是“您尝试过”,而不是“您尝试过”。:)
fabspro

@fabspro我认为“您尝试过吗”是正确的,因为OP已经接受了另一个答案,所以我指的事件(“解决问题”)已经过去,但是有人可能会说互联网一直在发生。无论如何,如果您建议编辑,我将很乐意将接受它的任务委托给审阅队列。资料来源:englishforums.com/English/HaveYouTriedOrDidYouTry/zclxb/…–
beppe9000

我想如果他解决了问题,那么您的询问本可以是对他的回答的评论-诸如“当您在研究问题时,您尝试过________实用程序的事情之一?” 也许...只是在暗示:)
fabspro

... touché :)
beppe9000 '17

huehuehuehuehue
fabspro

-2

如果您真的想挂起PC,完全导致PC 死机,只需用尽其所有RAM并将其强制到页面内存即可。这将不仅仅是冻结,而且实际上只是使事情过载,以致您甚至不能使用任务管理器,甚至不能通过键盘。即使终止该过程,PC仍需要很长时间才能恢复。(这是最好的!)

例如,您可以创建一个指向其自身的指针的类,然后在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应用程序替换进程名称。


3
这很可能只会耗尽RAM并导致硬盘驱动器损坏。根据您的计算机规格,计算机可能会继续工作,特别是因为列出的这些程序中有4个非常轻巧(iexplore.exe可能explorer.exe会产生更大的影响)。它只会自动终止占用内存的进程。
MoonRunestar

-10
  1. 转到C:\ Windows \ Temp \
  2. 按Ctrl-a全选
  3. 按下Enter

8
您需要成千上万的物品才能有效实现此目的!我的%TEMP%文件夹为空...
AlainD

6
尽管这似乎是回答这个问题的合理尝试,但目前还不清楚这应该如何导致Windows按照OP的要求锁定。请编辑您的问题,以解释为什么这样做会满足OP的要求。
Twisty模仿者

9
对于任何尝试过此方法但没有意识到自己被其中装有恶意软件的偷渡式下载所打击的人,我将感到抱歉。
MoonRunestar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.