2014-12-09 9 views
0

Я распечатываю некоторую отладочную информацию о callstack. Я могу получить имя функции достаточно легко, используя SymFromAddrПолучить функцию args from callstack address

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 

} 

Однако я хочу, чтобы воспроизвести полную сигнатуру функции для того, чтобы устранить неоднозначность между переопределениями и в основном воспроизводит то, что показано в визуальном окне студии стеки вызовов. Я не могу найти вызов api для достижения этого.

Есть ли один?

+1

Убедитесь, что вы не установили 'SYMOPT_UNDNAME' при вызове [SymSetOptions] (http://msdn.microsoft.com/en-us/library/ окна/настольные/ms681366.aspx). После того, как у вас есть украшенное имя символа, вы можете вызвать [UnDecorateSymbolName] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms681400.aspx), чтобы оно превратилось в то, что Visual Studio * Callstack * окна. – IInspectable

+0

@Inspectable Спасибо - это именно то, что я хотел. –

ответ

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: Using PDB files and symbols to debug your application

 Смежные вопросы

  • Нет связанных вопросов^_^