2017-11-16 5 views
0

ICorProfilerInfo 인터페이스를 사용하여 CLR 프로파일 러를 작성하고 있습니다.GetFunctionInfo를 사용하여 FunctionID에서 함수 이름 가져 오기

SetEnterLeaveFunctionHooks을 사용하는 경우 콜백 메서드는 FunctionID으로 전달됩니다.

주어진 기능의 메타 데이터 (예 : 특히 이름 뒤에 있음)를 얻으려면 어떻게해야합니까? FunctionID?

MSDN 문서에 따르면 첫 번째 호출은 GetFunctionInfo이어야합니다. 이 함수의 documentation 상태 :

프로파일 러 코드가 소정 모듈에 대한 메타 데이터 인터페이스를 얻었다 ICorProfilerInfo :: GetModuleMetaData를 호출 할 수있다. pToken이 참조하는 위치로 리턴 된 메타 데이터 토큰을 사용하여 함수의 메타 데이터에 액세스 할 수 있습니다.

마지막 문장 ('메타 데이터 토큰 ... 함수의 메타 데이터에 액세스하는 데 사용할 수 있음')에 대해 자세히 설명하지 않습니다. 어떻게 작동합니까?

mdToken ptkResolutionScope; 
    WCHAR szName[1024]; 
    ULONG cchName = 1024; 
    ULONG pchName; 

    HRESULT result = MetaDataImport->GetTypeRefProps(pToken, &ptkResolutionScope, szName, cchName, &pchName); 

마지막 호출이 S_FALSE을 반환하고 szName을 채우지 않습니다 :

void MyProfiler::EnterMethod(FunctionID functionID) 
{ 
    ClassID classId = 0; 
    ModuleID moduleId = 0; 
    mdToken metaDataToken = 0; 
    IMetaDataImport* metaDataImport = NULL; 

    // (m_info is ICorProfilerInfo3) 
    m_info->GetFunctionInfo(functionID, &classId, &moduleId, &metaDataToken); 
    m_info->GetModuleMetaData(moduleId, ofRead, IID_IMetaDataImport, (IUnknown**)&metaDataImport); 

    // What goes here? 
} 

이 같은 GetTypeRefProps 전화를 시도 :

지금까지, 나는 다음을 수행하고있다.

답변

1

GetTypeRefProps은 토큰이 TypeRef 토큰 일 때만 적용되며 GetFunctionInfoGetMethodProps 메서드를 사용해야하는 MethodDef 토큰을 제공합니다.

metaDataImport->GetMethodProps(metaDataToken, NULL, szName, cchName, &pchName, NULL, NULL, NULL, NULL, NULL);