码龄 5 年后,我是如何用 Process Explorer 系统化解决 Windows 疑难杂症的

很多人在排查 Windows 问题时,第一反应都是按下 Ctrl + Shift + Esc 打开任务管理器:看 CPU、看内存、看哪个进程“红”了,然后结束任务。
但当问题变成:

  • 明明 CPU 不高,系统就是卡
  • 内存一点点被吃光,不知道是谁在慢慢涨
  • 怀疑中了木马,任务管理器里看不出异常

任务管理器就显得非常无力了。

这时候,Process Explorer 就该上场了。
它不是“高级任务管理器”那么简单,而是一个可以支撑你建立整套排障方法论的“进程级显微镜”。

本文不是简单的“功能菜单罗列”,而是围绕几个典型场景,讲清楚:

  • Process Explorer 能解决什么问题
  • 应该开哪些列,关注哪些指标
  • 如何把它变成你日常排障的“标准动作”

一、为什么是 Process Explorer,而不是任务管理器?

如果一句话概括:

任务管理器适合“看看”,Process Explorer 适合“搞清楚”。

Process Explorer 主要补齐了任务管理器的这些短板:

  • 看到完整的进程树关系(父子进程是谁)

  • 查看每个进程的启动命令行、完整路径、数字签名

  • 按进程查看线程、句柄、模块(DLL)、网络连接

  • 精细拆分 CPU / 内存 / I/O / 句柄 等多维指标

  • 支持搜索:

    • 哪个进程占用了这个文件?
    • 哪个进程占用了这个端口?

对一个码龄 ≥ 5 年的开发者 / 运维 / 测试来说,更重要的是:

  • 它能帮你建立一套 “观察 → 假设 → 验证” 的排障流程,而不是拍脑袋结束任务。
  • 很多“玄学问题”(偶发卡顿、长时间跑挂掉、只在客户环境出现的问题),都需要这样的工具才能看出端倪。

二、第一次上手:界面与核心信息怎么读?

如果你第一次打开 Process Explorer,可能会被密密麻麻的界面劝退。
但大部分时候,你只需要把握三块内容:

  1. 上面的 进程列表(Process Tree)
  2. 列(Columns)呈现的关键信息
  3. 双击进程后弹出的 属性窗口(Properties)

2.1 进程树:谁是父进程,谁是“同伙”

进程树最大的价值在于:把“孤立的进程列表”变成“有因果关系的树状结构”。

比如:

  • 浏览器主进程启动出一堆渲染进程
  • 某个“启动器”进程拉起真正的业务程序
  • 某个脚本运行时不断创建子进程执行命令

当你看到一个占用资源异常的子进程时,可以顺着树往上看:

  • 它是谁拉起来的?
  • 这个父进程是不是某个你不熟悉的软件?
  • 一旦结束父进程,下面一串子进程是否会一并消失?

在排查恶意程序、脚本跑飞、自动任务异常时,这非常关键。

2.2 列(Columns):先把“看的信息”选对

默认列往往不够用,建议至少打开这些:

  • Image Name / Description / Company Name
  • Image Path / Command Line / User Name / Session
  • CPU / CPU History / Threads / Handles
  • Working Set / Private Bytes / Commit Size

它们分别回答的是:

  • 这是谁?从哪来的?路径正规吗?(身份)
  • 是哪个用户 / 哪个会话在跑?(归属)
  • 现在有多忙?资源占用如何?(状态)

把这几列配置好,基本就够支撑 80% 的日常排障。

2.3 双击进程:属性窗口是第二现场

选中一个进程双击,可以看到更多细节:

  • Image:路径、命令行、签名、工作目录
  • Performance:CPU、内存、线程、句柄等趋势
  • Threads:每个线程的 CPU 使用率、调用栈
  • TCP/IP:网络连接情况
  • Handles / DLLs:该进程占用了哪些对象 / 加载了哪些模块

遇到棘手问题时,这里就是你“深挖”的主战场。


三、典型场景一:CPU 飙高时,如何快速定位罪魁祸首?

场景很常见:风扇狂转、系统卡顿、CPU 90%+,但任务管理器里只看到“System”、“某个浏览器”、“某个 IDE”在高占用,却说不清到底是谁搞的鬼。

处理步骤可以固化成一个小流程。

3.1 步骤 1:按 CPU 排序,锁定可疑进程

  • 打开 Process Explorer

  • 在列头点击 CPU,按占用率排序

  • 关注:

    • 持续高占用的进程
    • CPU History 一直在高位的进程

不要只盯着一瞬间的数字,更要看“趋势”。

3.2 步骤 2:看 Threads,找出最忙的那几根线程

双击进程 → 切到 Threads 标签:

  • 按 CPU 排序,看哪几个线程最忙
  • 记住这些线程的 TID(线程 ID)

然后选中一个异常高的线程,点击 Stack(调用栈)

  • 如果有符号,可以看到是哪个模块 / 函数在消耗 CPU

  • 经常会发现:

    • 某个第三方 DLL 的循环逻辑
    • 某个驱动 / 插件在频繁运行
    • 某个 GC / JIT 行为异常频繁

这一步的目标是:

从“这个进程很忙”,进一步缩小到“这几个线程在忙”,再缩小到“这段代码 / 这个模块在忙”。

3.3 步骤 3:结合实际场景做判断

例如:

  • IDE 进程高 CPU,线程栈里全是语法分析 / 索引模块

    • 很可能是项目太大 / 索引被强制重建
  • 浏览器进程高 CPU,栈里出现某个插件模块

    • 禁用插件验证一下
  • 某个服务进程高 CPU,栈里总停在加锁 / 等待位置

    • 多半是线程竞争 / 死锁前兆

这样,你给出的结论就不再是“把进程杀了就好了”,而是“哪一类逻辑导致了高 CPU”。


四、典型场景二:内存一点点被吃光,怎么判断是不是内存泄漏?

另一个常见现象是:

  • 系统刚重启一切正常
  • 某个服务 / 应用跑着跑着,内存占用越来越高
  • 最后不是崩溃就是被系统强行回收

这时,比起任务管理器那个“内存”数字,Process Explorer 能提供更细的拆分。

4.1 先搞清几个核心概念

  • Working Set(工作集)

    • 当前真正驻留在物理内存里的那部分
  • Private Bytes(私有字节)

    • 这个进程独占的、其他进程不能共享的内存
  • Commit Size

    • 系统为该进程“承诺”分配的内存额度(物理 + 页面文件)

一个简单但非常实用的记忆法:

Working Set = 现在“占着座位”的人
Private Bytes = 整体“报了名”的人数
Commit Size = 学校说“我最多能给你留多少名额”

4.2 如何观察是不是在“慢慢长胖”

建议打开这几列:

  • Private Bytes / Private Bytes Peak
  • Working Set / WS Peak
  • Commit Size
  • GUI 程序再加上 GDI Objects / USER Objects

小实验步骤:

  1. 启动目标程序,记录一遍上述数值
  2. 正常使用一段时间(比如 30 分钟、1 小时)
  3. 再次看这些数值的变化趋势

如果你发现:

  • Private Bytes 持续增长,几乎不往回掉
  • GDI / USER Objects 数量也只增不减
  • 程序界面不断打开/关闭,但资源不回收

那么:

很大概率是内存 / 资源泄漏,至少是回收策略不健康。

这时 Process Explorer 的角色是:

  • 帮你量化问题:“从 200MB 涨到 1.2GB,GDI 对象从 300 涨到 4000”
  • 给你证据,可以配合专业内存分析工具(.NET profiler、native profiler)做下一步定位

五、典型场景三:怀疑中毒 / 有恶意程序,如何做初步排查?

Process Explorer 不等于杀毒软件,但它是非常好用的 “可疑行为放大镜”
你可以借助以下信息做第一轮筛查。

5.1 身份三要素:名称 + 路径 + 签名

建议重点关注这些列:

  • Image Name
  • Description / Company Name
  • Image Path
  • Verified Signer(签名验证)

典型可疑特征:

  • 名字看起来像系统进程(如 svchost.exe / explorer.exe),但路径不在 C:\Windows\System32

  • Company Name 写得很奇怪,或者是空白

  • Verified Signer 显示 “Unable to Verify / Not Signed”,但自称是某大厂

  • 路径位于:

    • %TEMP%
    • 隐蔽目录(带随机字符串)
    • 下载目录、桌面等很随意的位置

可以总结成一句排查口诀:

“系统名 + 临时盘路径 + 无签名”,优先怀疑。

5.2 行为线索:Command Line + User + Session

进一步结合:

  • Command Line

    • 是否带有明显的“静默参数”(如 -silent-hide-min
    • 是否加载奇怪 DLL / 脚本
  • User Name / Session

    • 是否在 SYSTEM / 高权限账号下运行
    • 是否出现在不该有 GUI 的 Session 里

例如:

  • 一个来历不明的 EXE,在后台以 SYSTEM 权限运行,命令行里还带有加载远程 DLL 的参数
  • 某个看似“驱动更新工具”,路径在临时目录,Company “Unknown”,签名不可验证

这类进程就值得进一步用专业安全工具扫描。


六、进阶:把 Process Explorer 和其他 Sysinternals 工具串起来用

当问题变复杂时,单靠一个工具往往不够。
Sysinternals 套件里有很多可以联动的工具:

  • Process Monitor(ProcMon)

    • 记录文件 / 注册表 / 进程操作
    • 适合排查 “安装 / 启动时到底访问了哪些资源”
  • Autoruns

    • 枚举所有启动项、计划任务、浏览器插件等
    • 找“启动即常驻”的奇怪项目非常好用
  • TCPView

    • 查看当前所有网络连接,可按进程过滤
    • 配合 Process Explorer 的 TCP/IP 信息一起看,定位某个进程正在对外通讯

一个常见的综合场景是:

  1. 用 Process Explorer 找到一个可疑进程
  2. 看它的路径、签名、命令行、网络连接
  3. 用 Autoruns 查查它是否注册了启动项 / 服务
  4. 必要时再用 ProcMon 抓一段生命周期内的操作痕迹

Process Explorer 是入口,其它工具是“深挖放大器”。


七、如何把 Process Explorer 固化为自己的排障方法论?

工具只是工具,真正拉开差距的是习惯和流程

可以尝试把下面这套流程变成自己的默认做法:

  1. 遇到问题先定性:

    • 卡顿?
    • 占用高?
    • 资源泄漏?
    • 行为异常(弹窗、网络连接)?
  2. 打开 Process Explorer,看全局:

    • CPU / 内存 整体情况
    • 哪些进程占比明显异常
  3. 针对性深入:

    • 高 CPU → 看 Threads + Stack
    • 内存问题 → 看 Private Bytes / WS / Peak
    • 可疑行为 → 看 Path / Command Line / Signer / TCP/IP
  4. 记录关键信息:

    • 进程名、版本、路径
    • 指标变化前后对比(截图 / 笔记)
    • 调整或重启之后的效果
  5. 回过头总结:

    • 这次问题如果再发生,我能不能用更少步骤更快定位?
    • 是否可以写成一篇“经验复盘”博客,下次直接参考?

这样,你不只是在“会用 Process Explorer”,
而是在用它构建自己的 Windows 排障知识体系


结语:从“按经验瞎试”到“有证据地排障”

对码龄 5 年以上的程序员 / 测试 / 运维来说,真正重要的已经不是“会不会某个命令 / 某个工具”,而是:

  • 能不能给出有证据支撑的判断
  • 能不能把一次次排障过程沉淀成可复用的方法论

Process Explorer 提供的,正是这样一副“看得见的证据界面”:

  • 它帮你看清楚每个进程的 来历、行为、资源占用和关系
  • 帮你从 “感觉卡” 走向 “谁在什么时间、做了什么事情导致了卡顿”
  • 帮你把一次次“经验排障”,变成可以写进博客、写进笔记的系统知识
Logo

昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链

更多推荐