- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试调用 SymLoadModuleEx
从 PDB 文件加载符号,然后使用 SymFromAddr
从该 PDB 中查找符号。但是,我不知道要为参数 BaseOfDll
和 DllSize
传递什么——文档明确指出加载 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 文件时要传入的 BaseOfDll
和 DllSize
?有问题的 PDB 文件是不同程序可执行文件(不是 DLL)的符号文件,只是为了论证,假设您无权访问生成 PDB 的原始 EXE。
或者,是否有更好的方法从 PDB 文件中查找与给定地址对应的符号?
最佳答案
dbghelp.dll 和此处的 Sym*
方法使用 Debug Interface Access (DIA) SDK。 1
DIA 本身是基于 COM 的,比 DbgHelp 提供的更加灵活。
具体来说,要加载已知的 PDB 并根据地址查找符号,您可以执行以下操作:
IDiaDataSource::loadDataFromPdb
加载特定的 PDB(不需要 DLL 大小和基地址)。IDiaDataSource::openSession
获取数据源的 IDiaSession
。findSymbolByVA
或 findSymbolByRVA
来获取与该地址关联的 IDiaSymbol
。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/
我正在尝试调用 SymLoadModuleEx从 PDB 文件加载符号,然后使用 SymFromAddr从该 PDB 中查找符号。但是,我不知道要为参数 BaseOfDll 和 DllSize 传递什
我是一名优秀的程序员,十分优秀!