如何使用SymLoadModuleEx加载PDB文件?

Ada*_*eld 8 c winapi dbghelp pdb-files

我正在尝试调用SymLoadModuleEx从PDB文件加载符号,然后用于SymFromAddr查找该PDB中的符号.但是,我想不出什么来传递的参数BaseOfDllDllSize-文件明确地说,加载PDB文件时,这些参数不能为0,确实试图通过0导致它失败ERROR_INVALID_PARAMETER.

这是我的代码的样子:

SymSetOptions(SYMOPT_LOAD_LINES);
HANDLE hprocess = GetCurrentProcess();
if (!SymInitialize(hprocess, NULL, FALSE))
    die("SymInitialize");

if(SymLoadModuleEx(hprocess, NULL, "full path to some PDB file.pdb", NULL,
                   0,  // What to pass here?
                   0,  // What to pass here?
                   NULL, 0) == 0)
{
    die("SymLoadModuleEx");
}
Run Code Online (Sandbox Code Playgroud)

你如何找出BaseOfDllDllSize以加载PDB文件时传递?有问题的PDB文件是不同程序可执行文件(不是DLL)的符号文件,只是为了参数,假设您无权访问生成PDB的原始EXE.

或者,是否有更好的方法从PDB文件中查找与给定地址对应的符号?

Chr*_*ich 10

dbghelp.dll和Sym*这里的方法使用调试接口访问(DIA)SDK.1
DIA本身是基于COM的,比DbgHelp提供的更灵活.

具体来说,要加载已知的PDB并根据地址查找符号,您可以执行以下操作:

  1. CoC创建DIA数据源(请参阅此处的"示例"部分).
  2. 使用IDiaDataSource::loadDataFromPdb装载特定的PDB(不需要DLL大小和基地址).
  3. 使用IDiaDataSource::openSession来获取IDiaSession您的数据源.
  4. 根据您是否具有绝对虚拟地址(VA)或相对虚拟地址(RVA),您可以分别使用findSymbolByVAfindSymbolByRVA获取IDiaSymbol与该地址关联的内容.
  5. 最后,您可以使用IDiaSymbol::get_name获取包含指定地址的函数名称.

这些都不需要原始图像; 只需要PDB.假设您正在使用Visual Studio,DIA的标头和库可以在(例如)下使用:
C:\Program Files (x86)\Microsoft Visual Studio 10.0\DIA SDK.