旧事重提:清理空间时别忘了符号文件缓存

如果准备在一个用作开发的系统上清理磁盘空间,有个地方可以找到你不想要的文件。这个地方就是你的调试程序符号文件缓存。

Windows 的调试引擎会创建符号文件的缓存,这样可以避免从设置的符号服务器上来回下载。以及,缓存也会变得很大,考虑到并没有自动清理这回事。¹ 有个故事叫《一个管理糟糕的缓存就是内存泄露的别称》,现在我们有了它的硬盘版。

需要查看的地方有

  • $(DebuggerInstallDirectory)\sym
  • %TEMP%\sym
  • 曾列入 %_NT_SYMBOL_PATH% 的所有目录²
  • C:\SymCache
  • C:\symbols

Visual Studio 也会缓存符号文件。你可以配置保存位置,它会存在 Tools、Options、Debugging、Symbols、Cache symbols 等目录下面。默认位置是 %TEMP%\SymbolCache

我用来勘探硬盘空间的工具是 WizTree。我和这个程序没有利益相关。我只是高兴。(同时还付了钱。)

我的解法是对上面这些潜在的缓存目录,逐个进行符号链接到同一个目录 C:\SymCache,这样不同的调试程序就能互相共享符号文件缓存了。

再聊五块钱:很多年以前,我在一台笔记本电脑上工作,打开了「磁盘清理」工具,然后我听见风扇开始要命地发出尖啸声,而笔记本电脑在「计算可供您清理的空间」。这很奇怪,所以我接上一个调试程序来找到,为什么就是下了决意,要进行一个 CPU 的高负载操作。³

最终发现「磁盘清理」工具陷入了紧张的循环:检测「取消」按钮是否被按下。同时,一个后台线程正在忙于进行计算。这种行为是 Windows 98 中的原版实现,正因如此而特别讽刺,考虑到 Windows 98 甚至不支持多线程。所以,这段代码就是想知道「我要不要继续等下去?」,把你的唯一一个 CPU 吃个精光,而把后台真正干实事的线程饿得发慌。

对于 Windows 10,版本 1709,我修复了这个问题,所以它不会再轮询取消按钮了。现在它实现为一个普通的「消息泵 message pump」,并在每条消息后对「取消」按钮进行检查。原理是,单击「取消」按钮原本就会产生一条信息,所以在每次有消息的时候检查就足矣。

这次修复将 UI 线程的 CPU 占用率降到了几乎为零。

之前也有一次讲到 CPU 回旋的问题。

再聊十块钱:在我修复了这个问题几周后,Windows 性能团队上报了一个错误,称他们的遥测数据显示磁盘清理工具的「取消」对话框异常消耗了大量 CPU 资源。我随即满足地告诉他们:「已经修复了。」……

¹ 你可以用 AgeStore 来进行人工清理。

²「因为符号文件有时可大到数十 MB…」,看到这句话你就可以脑补出这个页面的年月。关于那个页面本身就大于 1 MB 这件事,不要费心。(21 KB 用于主页本身,剩下的都是在页面上飘来飘去的浮云,例如 263 KB 用于 JavaScript 语法高亮库,还有 121 KB 用于 2021 年初发布的微软 Build 大会广告。)

本文在「一封樱花信」发表当日引者截下的微软 Ignite 大会广告

³ 之前我们也讲过,为什么清理 Windows 更新文件是一项 CPU 高负载操作

Raymond Chen 参与 Windows 的发展已有 30 多年。2003 年,他创办了一个名为「The Old New Things」的网站,这篇文章就是从该网站转载而来。该网站受欢迎的程度远远超出了他最疯狂的想象:一次时时让他恐慌的跃迁。该网站催生了一本书,巧合的是,这本书 2007 年由 Addison Wesley 发行时,最初也叫《The Old New Things》,后来引进中国,译名为《Windows 编程启示录》。他偶尔会出现在 Windows 开发人员文档 X 官号上 (@WindowsDocs),讲些没有干货的清闲故事。

这篇来源引注大部分都摘自微软开发者博客 The Old New Things(我将其译为「旧事重提」)上的作者简介

免责声明以及其它

一般意义上的声明可能有例外,即使这种例外没有得到明确的承认。
示例:「狗有四条腿。」
有些狗,是没有四条腿的。但一般来说,狗有四条腿。
此处的叙述未经客观事实核验。它们基于个人的人生经验和回忆,辅以知情的猜测。出于修辞目的,叙述可能故意制造错误,例如,为了避免被次要的话题分心,或者因为,其只是一个笑话。 并非所有引号都表示字面意义上的引用:有些可能代表想象的对话或真实对话的虚构。所有引用均经过改动,例如出于空间或隐私原因,但此类改动并不意味着改变原始叙述的基本含义。 诸如「某些人」之类的短语并不排除这些人可能是微软员工的可能性。因为微软员工也是人。同样,「某些程序」可能包括微软的程序,无论它们是计算机层面上的还是行政或其它层面上的。 此处提供的内容在修正上没有确定的制度。此处的声明并不确立微软公司的官方立场。文中提到的推荐和建议为作者(或作者信任的人和组织)提供的建议。此处内容均按「原样」提供,并在法律允许的程度内不提供任何种类(无论是明示还是暗含)的保证,也不授予任何附加权利。一言以蔽之,读者应运用批判性思维,来评估此处上下文中的陈述,并进行独立的明断。

留下评论

通过 WordPress.com 设计一个这样的站点
从这里开始