我想将堆栈跟踪数据从ETL文件(Windows事件跟踪)导出为可读性更强的格式。
CPU分析数据只对方法名有用,但是当记录计算机上不存在符号服务器访问时,只记录数据量以便以后将方法名加载到工具中作为额外的后期处理步骤将很有用。
例如,输入将是具有RVA(相对虚拟地址)的dll,如
内核32.dll +0xdddd
存储完这些数据后,我想从中得到完整的方法名。据我所知,符号服务器查找只使用元组
- PDB指南
- PDB年龄
- PDB名称
理论上,我应该能够使用带有以下签名的helper方法检索方法名:
string GetMethod(string dll, long RVA, Guid pdbGuid, int pdbAge, string pdbName)
查找方法的常规方法是使用Dbghelp.dll。为了能够使用,我需要调用SymInitialize,但是所有这些API都需要一个进程句柄。
BOOL IMAGEAPI SymInitializeW(
[in] HANDLE hProcess,
[in, optional] PCWSTR UserSearchPath,
[in] BOOL fInvadeProcess
);
当输入不是实时进程或内存转储文件时,是否有人有从Image RVA地址获取方法名称的经验?或者我是否需要使用另一个库(例如msdia140.dll)?
1条答案
按热度按时间c9qzyr3d1#
PerfView已经对此提供了完全支持。https://github.com/microsoft/perfview/blob/main/src/TraceEvent/Symbols/NativeSymbolModule.cs
这正是我所需要的,它使用了msdia140. dll。看起来“普通”的dbghelp.dll并不是最适合这个任务的。