当前位置: 首页 > news >正文

Process Monitor 学习笔记(5.23):把自定义“日志/标记”注入 Procmon 追踪

Process Monitor 学习笔记(5.23):把自定义“日志/标记”注入 Procmon 追踪

  • Process Monitor 学习笔记(5.23):把自定义“日志/标记”注入 Procmon 追踪
    • 一、为什么要“注入标记”?
    • 二、三种实战注入法(各取所需)
      • 方法 A:**文件/注册表“显式标记”**(最稳定、最直观)
      • 方法 B:**OutputDebugString / DbgPrint + DbgView 对时**(对代码侵入最小)
      • 方法 C:**ETW 事件 + 时间轴对齐**(工程化/规模化)
    • 三、标准操作流程(SOP)
    • 四、团队级落地建议
    • 五、常见问题(FAQ)
      • 小结

Process Monitor 学习笔记(5.23):把自定义“日志/标记”注入 Procmon 追踪

目标:在 Procmon 时间轴里放入你自己的“锚点(Marker)”,把应用日志与 I/O/注册表/进程事件严丝合缝地对齐,从“看到现象”到“精确定位哪一行代码触发了哪一次系统调用”。


一、为什么要“注入标记”?

排障常见痛点:

  • 应用日志系统调用(文件/注册表/进程/网络)时间对不上
  • 只看到 CreateFile/RegSetValue,但不知道是谁、在代码哪段触发;
  • 团队多端协作(客户端、服务端、代理/EDR)时,时序对齐非常困难。

解决思路:在复现场景的同时,让程序主动生成极易被 Procmon 识别的“标记事件”,然后用过滤/高亮秒级定位对应代码路径。


二、三种实战注入法(各取所需)

方法 A:文件/注册表“显式标记”(最稳定、最直观)

原理:在关键步骤(如“加载配置”“写缓存”“落库”)故意触发一次 极易匹配的 I/O / 注册表事件,例如写入到 C:\PMARK\XXXHKCU\Software\PMARK\Phase=XXX
优点:Procmon 原生显示,无额外工具;时间戳一体化;跨语言可用。
缺点:需要改动少量代码(或用脚本旁路触发)。

C/C++ 示例:文件标记

#include <windows.h>
#include <string>
void MarkFile(const wchar_t* phase) {CreateDirectoryW(L"C:\\PMARK", nullptr); // 无则创建std::wstring p = std::wstring(L"C:\\PMARK\\") + phase + L".mark";HANDLE h = CreateFileW(p.c_str(), GENERIC_WRITE, FILE_SHARE_READ, nullptr,CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY, nullptr);if (h != INVALID_HANDLE_VALUE) {// 写入一点点内容,确保 Procmon 有 Write 事件const char* msg = "procmon-marker\n";DWORD w = 0;WriteFile(h, msg, (DWORD)strlen(msg), &w, nullptr);CloseHandle(h);}
}

C/C++ 示例:注册表标记

#include <windows.h>
void MarkReg(const wchar_t* name, const wchar_t* value) {HKEY hKey;if (RegCreateKeyExW(HKEY_CURRENT_USER, L"Software\\PMARK", 0, nullptr, 0,KEY_SET_VALUE, nullptr, &hKey, nullptr) == ERROR_SUCCESS) {RegSetValueExW(hKey, name, 0, REG_SZ, (const BYTE*)value, (DWORD)((wcslen(value)+1) * sizeof(wchar_t)));RegCloseKey(hKey);}
}

PowerShell 快速标记

# 文件标记
New-Item -Path 'C:\PMARK' -ItemType Directory -Force | Out-Null
"procmon marker $(Get-Date -Format o)" | Set-Content -Path ("C:\PMARK\PHASE_{0}.mark" -f (Get-Date -Format HHmmssfff))# 注册表标记
New-Item -Path 'HKCU:\Software\PMARK' -Force | Out-Null
New-ItemProperty -Path 'HKCU:\Software\PMARK' -Name ('Phase_'+(Get-Date -Format HHmmss)) `-Value 'LoadConfig' -PropertyType String -Force | Out-Null

批处理(.bat)标记

@echo off
set p=C:\PMARK
if not exist "%p%" md "%p%"
echo procmon marker %time% > "%p%\PHASE_%time::=%.mark"
reg add HKCU\Software\PMARK /v Phase_%time::=% /t REG_SZ /d "LoadConfig" /f >nul

在 Procmon 中的做法

  • 过滤:Path contains C:\PMARKPath contains \Software\PMARK
  • 高亮:Path contains PMARK
  • 这样每个“PHASE_xxx.mark / RegSetValue”就是你在时间轴上的锚点

方法 B:OutputDebugString / DbgPrint + DbgView 对时(对代码侵入最小)

原理:在代码中输出 OutputDebugStringW(L"[PHASE] LoadConfig");,由 DbgView(或 WinDbg)捕获。将 DbgView 日志与 Procmon 导出 CSV 按时间戳对齐

C/C++

#include <windows.h>
void LogPhase(const wchar_t* phase) {OutputDebugStringW((std::wstring(L"[PHASE] ") + phase).c_str());
}

优点:改动极小,几乎所有语言/框架都有 debug 输出能力。
缺点:Procmon 不直接显示 debug 输出,需要 DbgView 配合(或把日志写到文件后再被 Procmon 捕捉)。

建议:同时采用 方法 A(文件/注册表标记) 放锚,方法 B 记录更丰富的语义日志。两边时间戳一对,定位“哪个调用引发了哪次 I/O”就非常顺手。


方法 C:ETW 事件 + 时间轴对齐(工程化/规模化)

  • 通过 ETW(Event Tracing for Windows) 打自定义 Provider(如 TraceLogging 或 Manifest)。
  • WPA(Windows Performance Analyzer)wevutil/logman 收集,再与 Procmon CSV 对齐时序
  • 适合大型系统、跨进程/跨主机排障,统一时钟源利于自动化。

三、标准操作流程(SOP)

  1. 在代码里放锚

    • 每个关键阶段调用一次 MarkFile("LoadConfig") / MarkReg("Phase", "LoadConfig")
    • 同时 OutputDebugString 打出更详细的语义日志。
  2. Procmon 预设过滤

    • Process Name is <你的进程>
    • Path contains PMARK(标记锚点)
    • Operation is CreateFile OR WriteFile OR RegSetValue(可选)
    • 加高亮:Path contains PMARKResult is NOT SUCCESSDuration ≥ 3ms
  3. 开始抓取 → 复现问题 → 停止

    • 观察“锚点”两侧的 I/O/注册表/进程操作,检查 Duration / Result / Detail
  4. 对时(如用 DbgView/ETW)

    • 导出 Procmon 为 CSV(File → Save),用 Excel/脚本按时间戳对齐 Debug 日志。
  5. 落地整改

    • 由“哪个锚点之后开始抖动/失败”→ 指向哪条调用链/哪个过滤驱动
    • 提出 白名单/路径迁移/策略排除 等变更,并复测验证。

四、团队级落地建议

  • 维护一个 “标记规范”:阶段名、命名规则、触发时机;
  • 在 CI/CD 或演练脚本里加入 标记自动化(例如 PowerShell/BAT 写入 PMARK);
  • 保存 Procmon 配置模板(Filters/Highlights/Columns),一键套用;
  • 把“锚点→事件→原因→解决”的案例沉淀为知识库。

五、常见问题(FAQ)

  • 需要管理员权限吗?
    创建 C:\PMARK 可能需要管理员;不行就改到当前用户目录(%LOCALAPPDATA%\PMARK),再用同样过滤。

  • 会污染系统吗?
    标记文件都在一个独立目录,复盘后可统一清理;注册表标记集中在 HKCU\Software\PMARK,删除即可。

  • 会影响性能吗?
    标记只在关键节点执行一次小 I/O,不会成为瓶颈;真的担心就只做 RegSetValue(更轻量)或纯 OutputDebugString


小结

“可观测性”不是只看一类日志。把应用语义系统调用 打通,Procmon 就不再是“放大镜”,而是与你的代码同频共振的时序仪

选一个你最顺手的标记法(强推:文件/注册表锚点),从今天开始把排障的时间,省给解决问题本身。

http://www.dtcms.com/a/515770.html

相关文章:

  • 专业集团门户网站建设服务商云落 wordpress
  • 基于MemU的自主代理记忆管理系统:技术解析与实践
  • 【ABAP函数】+CSAP_MAT_BOM_MAINTAIN更改BOM长文本
  • 小学英语资源合集
  • 裴蜀定理(Bézout‘s identity)
  • 在昇腾NPU上跑Llama 2模型:一次完整的性能测试与实战通关指南
  • 用wordpress建站一个人可以吗wordpress主题 表白
  • 鸿蒙6.0技术解析:五大行业迎来的智能化革命
  • Java的单例设计模式-饿汉式
  • 帝国建设网站phpcms做网站感想
  • 我的应用 Full GC 频繁,怎么优化?
  • clickhouse副本只有一个节点有数据原因
  • 【MySQL】从零开始了解数据库开发 --- mysql事务机制(二)
  • 国外手表网站湖南省专业建设公司网站
  • php使用腾讯云服务
  • 都安网站建设深圳专业seo优化公司
  • 小尺寸13*13cmRFSOC47DR数模混合信号处理卡
  • 基于PHP开发的医疗安全上报平台——医院不良事件管理系统,规范10大类50多种不良事件的上报、处理和追踪流程
  • Linux 中新建用户
  • bond模式以及配置清单
  • 汽车HIL测试供应商
  • 东方玉色静奢新生|欧神诺中国玉2025秋季新品重磅发布!
  • 织梦dede建站教程视频网站开发入门教程
  • 银川 网站建设郑州做网站 熊掌号
  • 工程实践心得记录-pytorch要安装在哪里
  • 19_AI智能体开发架构搭建之基于Qdrant构建知识库最佳实践指南
  • 零基础学AI大模型之LangChain PyPDFLoader实战与PDF图片提取全解析
  • 拉格朗日对偶法—入门版
  • Docker连接超时的解决方法
  • 显示网站建设精美页面天津外贸公司网站制作