gpt4 book ai didi

c - 如何使用 SymLoadModuleEx 加载 PDB 文件?

转载 作者:太空狗 更新时间:2023-10-29 17:01:02 32 4
gpt4 key购买 nike

我正在尝试调用 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");
}

您如何确定在加载 PDB 文件时要传入的 BaseOfDllDllSize?有问题的 PDB 文件是不同程序可执行文件(不是 DLL)的符号文件,只是为了论证,假设您无权访问生成 PDB 的原始 EXE。

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

最佳答案

dbghelp.dll 和此处的 Sym* 方法使用 Debug Interface Access (DIA) SDK。 1
DIA 本身是基于 COM 的,比 DbgHelp 提供的更加灵活。

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

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

这些都不需要原始图像;只需要 PDB。假设您使用的是 Visual Studio,DIA 的 header 和库位于(例如):
C:\Program Files (x86)\Microsoft Visual Studio 10.0\DIA SDK

关于c - 如何使用 SymLoadModuleEx 加载 PDB 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4867159/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com