2014-12-09 4 views
0

콜 스택에 대한 디버그 정보를 출력하고 있습니다. 나는 무시 사이에 명확하고 기본적으로 비주얼 스튜디오 호출 스택 창에 표시되는 것을 재현하기 위해 함수의 전체 서명을 재현하려는 그러나 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 

} 

를 사용하여 충분히 쉽게 함수 이름을 얻을 수 있습니다. 이를 달성하기 위해 API 호출을 찾을 수 없습니다.

하나 있습니까? 대답으로 날을 제공하는 @IInspectable에

+1

[SymSetOptions] (http://msdn.microsoft.com/en-us/library/)에서'SYMOPT_UNDNAME'을 설정하지 않았는지 확인하십시오. windows/desktop/ms681366.aspx). 데코 레이팅 된 심볼 이름이 있으면 [UnDecorateSymbolName] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms681400.aspx)을 호출하여 Visual Studio * Callstack * 창이 표시됩니다. – IInspectable

+0

@IInspectable 감사합니다 - 이것은 내가 원했던 것입니다. –

답변

0

감사합니다 : 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