我试图用来SymGetLineFromAddr64
获取从 PDB 加载的符号的源文件名。我加载 PDB 模块并枚举类型/符号,但我在枚举回调中获得Address
的指针字段SYMBOL_INFO
始终为 0,因此我无法使用它来获取源文件信息。(SymGetLineFromAddr64
失败并显示error code 126
“找不到指定的模块。”)
我也尝试使用该TI_GET_ADDRESS
属性,SymInfo->Index
但它也是 0。
这是我的main
:
int main(char **Argv, int Argc)
{
HANDLE Process = GetCurrentProcess();
DWORD ProcessId = GetProcessId(Process);
DWORD Options = SymGetOptions();
Options |= SYMOPT_DEBUG;
Options |= SYMOPT_LOAD_LINES;
Options |= SYMOPT_LOAD_ANYTHING; // Wanted to test if this would do anything at all, didn't do much
SymSetOptions(Options);
if (SymInitialize(Process, 0, 0) == TRUE)
{
char *FilePath = "C:\\Users\\pc\\Documents\\Saedo\\VSProjects\\x64\\Debug\\PDBReflector.pdb";
DWORD64 BaseAddress = 0x10000000;
DWORD FileSize = GetFileSize(FilePath);
DWORD64 Module = SymLoadModuleEx(Process, 0, FilePath, 0, BaseAddress, FileSize, 0, 0);
if (Module)
{
Reflector.Process = Process; //Reflector is just a global struct that contains the process and module base for use later
Reflector.ModuleBase = Module;
SymEnumTypes(Process, Module, EnumTypesProc, 0);
}
}
SymCleanup(Process);
return(0);
}
这是枚举器:
BOOL CALLBACK EnumTypesProc(SYMBOL_INFO *SymInfo, ULONG SymbolSize, VOID *UserContext)
{
if (SymInfo)
{
ULONG64 Address = SymInfo->Address; // Address is 0
//SymGetTypeInfo(Reflector.Process, Reflector.ModuleBase, SymInfo->Index, TI_GET_ADDRESS, &Address); // Address is 0 as well
IMAGEHLP_LINE64 LineInfo = {};
LineInfo.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
DWORD LineDisplacement = 0;
if (SymGetLineFromAddr64(Reflector.Process, Address, &LineDisplacement, &LineInfo))
{
Log("FILE: %s\n", LineInfo.FileName);
}
}
return(TRUE);
}
使用 VS2015 社区版编译,X64 调试模式,/Zi
调试信息格式和“调试优化”(/DEBUG
)。
请注意,我正在为正在运行的同一可执行文件加载 PDB。我认为这不是问题,因为我可以很好地加载其他类型信息。我还尝试检查另一个 PDB,地址也是 0。
问题:为什么我在地址字段中得到 0 以及如何实际获得正确的地址以便我可以检索特定类型/标签的源文件?很确定我在这里遗漏了一些明显的东西。
谢谢你的帮助。