Я печатаю некоторую отладочную информацию о стеке вызовов. Я могу получить имя функции достаточно легко, используя SymFromAddr
void getFunctionInfo(FunctionInfo& funcInfo, uintptr_t address)
{
DWORD64 dwDisplacement; //not used
static char buffer[ sizeof(SYMBOL_INFO) + MAX_SYM_NAME ];
PSYMBOL_INFO pSymbol = (PSYMBOL_INFO) buffer;
pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO);
pSymbol->MaxNameLen = MAX_SYM_NAME;
if ( SymFromAddr( m_process, address, &dwDisplacement, pSymbol) )
{
strcpy(funcInfo.funcName, pSymbol->Name, MAX_SYM_NAME);
}
//TODO get function arguments
}
Однако я хочу воспроизвести полную сигнатуру функции, чтобы устранить неоднозначность между переопределениями и в основном воспроизвести то, что показано в окне стека вызовов Visual Studio. Я не могу найти вызов API для достижения этой цели.
Есть один?
Спасибо @IInspectable за предоставление мне ответа: UnDecorateSymbolName
Это мой модифицированный код:
void getFunctionInfo(FunctionInfo& funcInfo, uintptr_t address)
{
static char buffer[ sizeof(SYMBOL_INFO) + MAX_SYM_NAME ];
PSYMBOL_INFO pSymbol = (PSYMBOL_INFO) buffer;
pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO);
pSymbol->MaxNameLen = MAX_SYM_NAME;
//set sym options to get the mangled function name
DWORD64 dwDisplacement;
DWORD options = SymGetOptions();
DWORD newOptions = options & ~SYMOPT_UNDNAME;
newOptions = newOptions | SYMOPT_PUBLICS_ONLY;
SymSetOptions(newOptions);
if (SymFromAddr(m_process, address, &dwDisplacement, pSymbol)) //m_process is set up elsewhere
{
//convert to full function name complete with params
char undecoratedName[MAX_SYM_NAME];
UnDecorateSymbolName(pSymbol->Name, undecoratedName, MAX_SYM_NAME, UNDNAME_COMPLETE);
strncpy(funcInfo.funcName, undecoratedName, MAX_SYM_NAME);
}
//revert to original options
SymSetOptions(options);
}
Существует также более сложный, но более мощный способ получения параметров функции и более того, используя SymGetTypeInfo. Подробности об этом можно найти в этой превосходной статье CodeProject: Использование файлов и символов PDB для отладки вашего приложения