我正在尝试使用 dbghelp 来查找类方法的地址。 例如,一个 DirectX 方法 (DXGI):dxgi!CDXGIFactory::CreateSwapChainImpl
我有正确的符号并且定义了 _NT_SYMBOLS_PATH。 使用 WinDBG,以下“x”命令运行良好:
0:000> x dxgi!CDXGIFactory::CreateSwapChain
6acb78ce dxgi!CDXGIFactory::CreateSwapChain (<no parameter info>)
6acdaf69 dxgi!CDXGIFactory::CreateSwapChain (<no parameter info>)
但是,尝试将此字符串与 SymFromName 一起使用时,出现错误 1168(未找到元素):
result = SymFromName( hprocess, L"dxgi!CDXGIFactory::CreateSwapChain", &symbol )
// result is false, GetLastError is 1168
失败是因为“::”,还是因为同一个符号有两个地址(我该如何解决?)。
最佳答案
肯定是 SYMOPT_EXACT_SYMBOL 设置导致抛出 1168 错误。否则有多个符号或 '::' 没问题,API 可以返回有效地址。
一种变通方法是使用损坏的名称:
#pragma optimize("", off)
class base
{
public:
void method(int i) { printf("in method(int)\n"); }
void method(double d) { printf("in method(double)\n"); }
};
int __cdecl main(int argc, char* argv[])
{
HANDLE hProcess = GetCurrentProcess();
SymInitialize(hProcess, NULL, TRUE);
SymSetOptions(SYMOPT_EXACT_SYMBOLS);
SetLastError(0);
SYMBOL_INFO symbol = {0};
symbol.SizeOfStruct = sizeof(symbol);
BOOL result = SymFromName(hProcess, "cpptest!?method@base@@QEAAXH@Z", &symbol);
printf("symbol : 0x%I64X\n", symbol.Address);
printf("error : %u, result : %u\n", GetLastError(), result);
return 0;
}
为了将来引用,WinDbg 使用 IDebugSymbols::StartSymbolMatch用于查找多个符号的 API。
关于windbg - 使用 dbghelp 查找类方法的符号地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18192455/