diff options
author | Andrey Kvochko <a.kvochko@samsung.com> | 2017-09-15 22:33:49 +0300 |
---|---|---|
committer | Ruben Ayrapetyan <r.ayrapetyan@samsung.com> | 2017-09-15 22:29:13 +0300 |
commit | 078126786c882c8d09fb2f9a69ad5800bfa8aa45 (patch) | |
tree | 9e2ca8d1fcd515db48fa6c045b5fe615fda611e5 /profiler | |
parent | b708dae33389b5a7370c062f655031a996d0f628 (diff) | |
download | heaptrack-078126786c882c8d09fb2f9a69ad5800bfa8aa45.tar.gz heaptrack-078126786c882c8d09fb2f9a69ad5800bfa8aa45.tar.bz2 heaptrack-078126786c882c8d09fb2f9a69ad5800bfa8aa45.zip |
Trace type name upon object allocation
Diffstat (limited to 'profiler')
-rw-r--r-- | profiler/profiler/src/profiler.cpp | 119 |
1 files changed, 85 insertions, 34 deletions
diff --git a/profiler/profiler/src/profiler.cpp b/profiler/profiler/src/profiler.cpp index f066399..7ded8dd 100644 --- a/profiler/profiler/src/profiler.cpp +++ b/profiler/profiler/src/profiler.cpp @@ -97,6 +97,52 @@ StackEntry::StackEntry(unsigned int funcId, strncpy(m_methodName, methodName, sizeof (m_methodName)); } +void PushShadowStack(FunctionID functionId, char* className, char* methodName) +{ + StackEntry *se; + + if (g_freeStackEntryListItems != nullptr) { + se = g_freeStackEntryListItems; + + g_freeStackEntryListItems = g_freeStackEntryListItems->m_next; + + new (se) StackEntry(functionId, className, methodName, g_shadowStack); + } else { + se = new StackEntry(functionId, className, methodName, g_shadowStack); + } + + g_shadowStack = se; +} + +void PopShadowStack() +{ + if (g_shadowStack != nullptr) { + StackEntry *top = g_shadowStack; + + g_shadowStack = g_shadowStack->m_next; + + top->m_next = g_freeStackEntryListItems; + g_freeStackEntryListItems = top; + } +} + +static HRESULT GetClassNameFromTypeDefAndMetadata(mdTypeDef mdClass, IMetaDataImport * pIMetaDataImport, LPWSTR wszClass) { + wchar_t wszTypeDef[MAX_NAME_LENGTH + 1]; + DWORD cchTypeDef = sizeof(wszTypeDef) / sizeof(wszTypeDef[0]); + + if (mdClass == 0x02000000) + mdClass = 0x02000001; + + HRESULT hr = pIMetaDataImport->GetTypeDefProps (mdClass, wszTypeDef, cchTypeDef, + &cchTypeDef, 0, 0); + if (hr != S_OK) + return hr; + + StringCchCopyW (wszClass, cchTypeDef, wszTypeDef); + + return S_OK; +} + static HRESULT GetMethodNameFromTokenAndMetaData (mdToken dwToken, IMetaDataImport * pIMetaDataImport, LPWSTR wszClass, LPWSTR wszMethod) { @@ -118,19 +164,7 @@ static HRESULT GetMethodNameFromTokenAndMetaData (mdToken dwToken, IMetaDataImpo StringCchCopyW (wszMethod, cchMethod, _wszMethod); - wchar_t wszTypeDef[MAX_NAME_LENGTH + 1]; - DWORD cchTypeDef = sizeof(wszTypeDef) / sizeof(wszTypeDef[0]); - - if (mdClass == 0x02000000) - mdClass = 0x02000001; - - hr = pIMetaDataImport->GetTypeDefProps (mdClass, wszTypeDef, cchTypeDef, - &cchTypeDef, 0, 0); - if (hr != S_OK) - return hr; - - StringCchCopyW (wszClass, cchTypeDef, wszTypeDef); - return S_OK; + return GetClassNameFromTypeDefAndMetadata(mdClass, pIMetaDataImport, wszClass); } static HRESULT GetMethodNameFromFunctionId (ICorProfilerInfo *info, FunctionID functionId, LPWSTR wszClass, LPWSTR wszMethod) @@ -152,6 +186,29 @@ static HRESULT GetMethodNameFromFunctionId (ICorProfilerInfo *info, FunctionID f return hr; } +static HRESULT GetClassNameFromClassId(ICorProfilerInfo *info, ClassID classId, LPWSTR wszClass) { + ModuleID moduleId; + mdTypeDef mdClass; + + HRESULT hr = info->GetClassIDInfo(classId, &moduleId, &mdClass); + + if (hr != S_OK) + return hr; + + IMetaDataImport * pIMetaDataImport; + hr = info->GetModuleMetaData(moduleId, CorOpenFlags::ofRead, IID_IMetaDataImport, + (LPUNKNOWN *)&pIMetaDataImport); + if (hr != S_OK) + return hr; + + hr = GetClassNameFromTypeDefAndMetadata(mdClass, pIMetaDataImport, wszClass); + if (hr != S_OK) + return hr; + + pIMetaDataImport->Release(); + return S_OK; +} + void encodeWChar(WCHAR *orig, char *encoded) { int i = 0; while (orig[i] != 0) { @@ -190,31 +247,12 @@ void OnFunctionEnter(FunctionIDOrClientID functionID, encodeWChar(szClassName, className); encodeWChar(szMethodName, methodName); - StackEntry *se; - - if (g_freeStackEntryListItems != nullptr) { - se = g_freeStackEntryListItems; - - g_freeStackEntryListItems = g_freeStackEntryListItems->m_next; - - new (se) StackEntry(functionID.functionID, className, methodName, g_shadowStack); - } else { - se = new StackEntry(functionID.functionID, className, methodName, g_shadowStack); - } - - g_shadowStack = se; + PushShadowStack(functionID.functionID, className, methodName); } void OnFunctionLeave(FunctionIDOrClientID functionID, COR_PRF_ELT_INFO eltInfo) { - if (g_shadowStack != nullptr) { - StackEntry *top = g_shadowStack; - - g_shadowStack = g_shadowStack->m_next; - - top->m_next = g_freeStackEntryListItems; - g_freeStackEntryListItems = top; - } + PopShadowStack(); } HRESULT STDMETHODCALLTYPE Profiler::Initialize(IUnknown *pICorProfilerInfoUnk) { @@ -456,6 +494,16 @@ HRESULT STDMETHODCALLTYPE assert(false && "Failed to retreive ICorProfilerInfo"); } + WCHAR szClassName[MAX_NAME_LENGTH + 1]; + hr = GetClassNameFromClassId(info, classId, szClassName); + + if (hr == S_OK) + { + char className[MAX_NAME_LENGTH + 1]; + encodeWChar(szClassName, className); + PushShadowStack((FunctionID)classId, className, className); + } + ULONG objectSize; HRESULT hr2 = info->GetObjectSize(objectId, &objectSize); @@ -466,6 +514,9 @@ HRESULT STDMETHODCALLTYPE heaptrack_objectallocate((void *) objectId, objectSize); + if (hr == S_OK) + PopShadowStack(); + return S_OK; } |