Files
envi-code/.gitignore
T
company-desktop e0c9e84acc perf: 增加 diagsession/ETL 的 CPU 采样一键分析脚本
配合 diagsession-cpu-analysis.md 使用。之前分析图纸打开慢时,是临时在
%TEMP% 里拼了四个脚本按主题分别聚合;这次合并成一个,可以反复跑。

用法:
    :: 先花 10 秒确认符号能对上(关键)
    python tools\perf_diagsession.py C:\temp\open.etl --verify-only
    :: 出报告
    python tools\perf_diagsession.py C:\temp\open.etl --out report-cpu-hotspots.md

做的事:
1. .diagsession 是 zip,自动解出内部最大的 .etl;
2. 符号校验:拿 trace 里记录的 TimeDateStamp + SizeOfImage 去
   <repo>/bin/Code2026/** 找同一份二进制,再找它旁边的 .pdb,
   符号路径只加这些目录 + C:\Symbols 本地缓存,默认不联网;
   这一步很关键——采集用的二进制和 bin 下的不是同一份时,
   我们的函数只能显示成「模块 + RVA」,脚本会明确告警;
3. 跑一趟 xperf -a dumper,一次遍历同时算出:模块独占/包含、
   函数独占、我们模块自身的耗时、出现在栈里的骨架函数、
   驱动 Parasolid 的我们的函数、线程分布、主干调用链、
   SQLite/Parasolid 的直接调用点、每秒时间线;
4. 输出 markdown 报告 + 原始聚合 JSON。

几个踩过的坑,已在实现里处理:
- trace 里的 EndAddr-BaseAddr 是 SizeOfImage(虚拟大小,0x1000 对齐),
  不能拿去和文件大小比,否则所有模块都判成「版本不符」;
- 部分目标不写 PE 时间戳(为 0),此时退化为只比 SizeOfImage;
- 模块基址未知时不能换算 RVA,否则会算出负数;
- STL 容器名(std::_Tree<std::_Tmap_traits<...>>)一行几百字符,
  报告里折叠模板参数后再输出。

被 .gitignore 的 *.py 规则排除,这里显式加了例外;
同时补上 __pycache__/ 忽略。

验证:在 report.diagsession 上跑通(PDB 匹配 28/28,22 个是我们的模块),
生成的结论已写入 diagsession-cpu-analysis.md。纯离线分析工具,不影响任何 target 的编译。
2026-10-28 14:47:30 +08:00

20 lines
154 B
Plaintext

Arx/
ZRX/
cmake_output/
bin/
lib/
*.dwg
*.png
*.dwl
*.dwl2
*.pdf
*.pcf
*.bat
*.scr
*.py
*.tmp
*.aps
*.diagsession
!tools/perf_diagsession.py
__pycache__/