Получить аргументы функции из адреса стека вызовов

Я печатаю некоторую отладочную информацию о стеке вызовов. Я могу получить имя функции достаточно легко, используя 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 для достижения этой цели.

Есть один?

0

Решение

Спасибо @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 для отладки вашего приложения

0

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector