debugging 从图像RVA获取方法名称

xmq68pz9  于 2023-01-05  发布在  其他
关注(0)|答案(1)|浏览(158)

我想将堆栈跟踪数据从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)?

c9qzyr3d

c9qzyr3d1#

PerfView已经对此提供了完全支持。https://github.com/microsoft/perfview/blob/main/src/TraceEvent/Symbols/NativeSymbolModule.cs

/// <summary>
/// This overload of SourceLocationForRva like the one that takes only an RVA will return a source location
/// if it can.   However this version has additional support for NGEN images.   In the case of NGEN images 
/// for .NET V4.6.1 or later), the NGEN images can't convert all the way back to a source location, but they 
/// can convert the RVA back to IL artifacts (ilAssemblyName, methodMetadataToken, iloffset).  THese can then
/// be used to look up the source line using the IL PDB.  
/// 
/// Thus if the return value from this is null, check to see if the ilAssemblyName is non-null, and if not 
/// you can look up the source location using that information.  
/// </summary>
public SourceLocation SourceLocationForRva(uint rva, out string ilAssemblyName, out uint methodMetadataToken, out int ilOffset)
{

这正是我所需要的,它使用了msdia140. dll。看起来“普通”的dbghelp.dll并不是最适合这个任务的。

相关问题