配合 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 的编译。
20 lines
154 B
Plaintext
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__/
|