54

这个简单的批处理文件以相对较短的顺序消耗了 Windows 7 (x64) 上的所有可用内存。这是怎么回事?可以采取哪些预防措施来防止它?

any-invalid-command-you-like-here ^

显示效果显然必要的先决条件:

  • 插入符号^是文件中的最后一件事,并且脚本不会以换行符终止
  • 插入符号前面至少有 2 个空格或字符,例如,如果下面的点表示空格,则不会触发内存泄漏.^,而这个会..^(只是慢慢地)

在这个Process Explorer屏幕截图中,脚本已经运行了大约 30 秒,消耗了 2.9GB,并且还在以稳定的速度攀升:

2.9GB内存消耗,还在攀升

如果您要对此进行试验,请确保您可以访问关闭窗口 [X] 控件,或者启动任务管理器或进程资源管理器并准备就绪,因为Ctrl-C, Ctrl-Break,Alt-F4 没有效果

似乎多个插入符号会导致内存使用量增加得更快。我第一次遇到这种情况时,1 或 2 分钟内没有足够的内存来做简单Alt-Tab的事情,比如三指敬礼Ctrl-Alt-Del也无效。我不得不硬关闭机器。

4

1 回答 1

45

想法

造成这种情况的原因(据我了解)是由于 cmd 解释器正在寻找要转义的字符,因为它^是批处理转义字符。在这种情况下,cmd没有正确识别文件的结尾,eof而是在寻找要转义的字符时不断循环和初始化某些内容。

在 Windows 8 Pro (64) 上重现(cc^^^使用多个插入符号来加速泄漏)。

试验

cc^无限循环并且泄漏非常缓慢。

cc^^因正常的无效命令错误而崩溃。

cc^^^无限循环和泄漏更快。

cc ^无限循环并且泄漏非常缓慢。

cc ^^因正常的无效命令错误而崩溃。

cc ^^^无限循环和泄漏更快。

cc"^因正常的无效命令错误而崩溃。

cc"^^因正常的无效命令错误而崩溃。

cc"^^^因正常的无效命令错误而崩溃。

笔记

  • ^仅在字面上使用插入符号时(在引号之外)出现无限循环和泄漏。添加引用时,脚本会因标准无效命令错误而崩溃。
  • 当批处理文件被编码为UTF-8ASCII时,只有无限循环和泄漏。当UTF-16时,脚本因标准无效命令错误而崩溃。
  • 必须是奇数个插入符号,以免逃脱最后一个插入符号。

防范措施

  • 确保没有批处理脚本以插入符号^(0x5E) 或至少奇数个插入符号结尾。
  • 或者将它们编码为 UTF-16。
于 2013-03-18T03:15:07.043 回答