Skip to content

Commit acc8d5e

Browse files
authored
Merge pull request #1 from swiftly-solution/update
update(src): Small Changes
2 parents 917d666 + 74c572c commit acc8d5e

8 files changed

Lines changed: 448 additions & 236 deletions

File tree

src/CorProfiler.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
#include "corhlpr.h"
1313
#include "ProfilerPal.h"
1414

15-
1615
PROFILER_STUB EnterStub(FunctionIDOrClientID functionId, COR_PRF_ELT_INFO eltInfo)
1716
{
1817
GlobalStackManager()->FunctionEnter(functionId, eltInfo);
@@ -57,6 +56,8 @@ HRESULT STDMETHODCALLTYPE CorProfiler::Initialize(IUnknown *pICorProfilerInfoUnk
5756

5857
GlobalStackManager()->SetCorProfilerInfo(this->corProfilerInfo);
5958

59+
const int tracerLevel = GlobalStackManager()->GetTracerLevel();
60+
6061
DWORD eventMask =
6162
COR_PRF_MONITOR_ENTERLEAVE |
6263
COR_PRF_MONITOR_THREADS |
@@ -65,6 +66,8 @@ HRESULT STDMETHODCALLTYPE CorProfiler::Initialize(IUnknown *pICorProfilerInfoUnk
6566
COR_PRF_ENABLE_FUNCTION_RETVAL |
6667
COR_PRF_ENABLE_FRAME_INFO;
6768

69+
LOG("Tracer level: %d (argument capture: %s)", tracerLevel, tracerLevel == 2 ? "enabled" : "disabled");
70+
6871
auto hr = this->corProfilerInfo->SetEventMask(eventMask);
6972
if (hr != S_OK)
7073
{

src/Exports.h

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,36 @@
11
#pragma once
22

33
#include "StackManager.h"
4+
#include <atomic>
45

56
#ifndef _WIN32
67
#define EXPORT_API extern "C" __attribute__((visibility("default")))
78
#else
89
#define EXPORT_API extern "C" __declspec(dllexport)
910
#endif
1011

11-
EXPORT_API void SW2TracerDump(const char* path)
12+
EXPORT_API void SW2TracerDump(const char *path)
1213
{
14+
if (path == nullptr || path[0] == '\0')
15+
return;
16+
17+
static std::atomic_flag dumpInProgress = ATOMIC_FLAG_INIT;
18+
if (dumpInProgress.test_and_set(std::memory_order_acquire))
19+
return;
20+
21+
struct DumpGuard
22+
{
23+
std::atomic_flag &flag;
24+
~DumpGuard()
25+
{
26+
flag.clear(std::memory_order_release);
27+
}
28+
} guard{dumpInProgress};
29+
1330
GlobalStackManager()->Dump(path);
31+
}
32+
33+
EXPORT_API void SW2TracerSetTracerLevel(int level)
34+
{
35+
GlobalStackManager()->SetTracerLevel(level);
1436
}

src/Helper.h

Lines changed: 81 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <string>
44
#include <algorithm>
55
#include <codecvt>
6+
#include <cstdint>
67
#include <locale>
78
#include <vector>
89
#if defined(_WIN32)
@@ -63,40 +64,81 @@ inline void CopyWTrunc(WCHAR *dst, ULONG dstLen, const std::basic_string<WCHAR>
6364
dst[n] = static_cast<WCHAR>(0);
6465
}
6566

66-
inline void GetTypeName2(ICorProfilerInfo15 *pInfo, IMetaDataImport2 *pMetaDataImport, mdToken mdType, ULONG numGenericTypeArgs, ClassID *genericTypeArgs, WCHAR *pszName, ULONG bufferLen);
67+
inline void GetTypeName2(ICorProfilerInfo15 *pInfo, IMetaDataImport2 *pMetaDataImport, mdToken mdType, ULONG numGenericTypeArgs, ClassID *genericTypeArgs, WCHAR *pszName, ULONG bufferLen, ULONG recursionDepth = 0);
6768

6869
inline void GetTypeName(ICorProfilerInfo15 *pInfo, IMetaDataImport2 *pMetaDataImport, ClassID classId, ModuleID moduleId, WCHAR *pszName, ULONG bufferLen)
6970
{
70-
mdTypeDef mdType;
71-
ClassID parentClassId;
71+
if (pszName == nullptr || bufferLen == 0)
72+
return;
73+
74+
pszName[0] = static_cast<WCHAR>(0);
75+
76+
if (pInfo == nullptr || classId == 0)
77+
return;
78+
79+
mdTypeDef mdType = mdTypeDefNil;
80+
ClassID parentClassId = 0;
7281
ULONG32 numGenericTypeArgs = 0;
7382

74-
pInfo->GetClassIDInfo2(classId, NULL, &mdType, &parentClassId, 0, &numGenericTypeArgs, NULL);
83+
if (FAILED(pInfo->GetClassIDInfo2(classId, NULL, &mdType, &parentClassId, 0, &numGenericTypeArgs, NULL)) || mdType == mdTypeDefNil)
84+
return;
7585

7686
std::vector<ClassID> genericTypeArgs;
7787
if (numGenericTypeArgs)
88+
{
7889
genericTypeArgs.resize(numGenericTypeArgs);
79-
if (numGenericTypeArgs)
80-
pInfo->GetClassIDInfo2(classId, NULL, &mdType, &parentClassId, numGenericTypeArgs, &numGenericTypeArgs, genericTypeArgs.data());
90+
ULONG32 fetched = numGenericTypeArgs;
91+
if (FAILED(pInfo->GetClassIDInfo2(classId, NULL, &mdType, &parentClassId, numGenericTypeArgs, &fetched, genericTypeArgs.data())))
92+
{
93+
genericTypeArgs.clear();
94+
numGenericTypeArgs = 0;
95+
}
96+
else
97+
{
98+
numGenericTypeArgs = fetched;
99+
genericTypeArgs.resize(numGenericTypeArgs);
100+
}
101+
}
81102

82103
IMetaDataImport2 *metadataImport = pMetaDataImport;
83104
bool releaseMeta = false;
84105
if (metadataImport == NULL)
106+
{
85107
releaseMeta = SUCCEEDED(pInfo->GetModuleMetaData(moduleId, ofRead, IID_IMetaDataImport2, reinterpret_cast<IUnknown **>(&metadataImport))) && metadataImport != nullptr;
108+
if (!releaseMeta)
109+
return;
110+
}
86111

87112
GetTypeName2(pInfo, metadataImport, mdType, numGenericTypeArgs, genericTypeArgs.empty() ? nullptr : genericTypeArgs.data(), pszName, bufferLen);
88113
if (releaseMeta)
89114
metadataImport->Release();
90115
}
91116

92-
inline void GetTypeName2(ICorProfilerInfo15 *pInfo, IMetaDataImport2 *pMetaDataImport, mdToken mdType, ULONG numGenericTypeArgs, ClassID *genericTypeArgs, WCHAR *pszName, ULONG bufferLen)
117+
inline void GetTypeName2(ICorProfilerInfo15 *pInfo, IMetaDataImport2 *pMetaDataImport, mdToken mdType, ULONG numGenericTypeArgs, ClassID *genericTypeArgs, WCHAR *pszName, ULONG bufferLen, ULONG recursionDepth)
93118
{
94-
ULONG length = bufferLen;
95-
DWORD flags;
96-
mdTypeDef mdBaseType;
119+
if (pszName == nullptr || bufferLen == 0)
120+
return;
121+
97122
pszName[0] = static_cast<WCHAR>(0);
98123

124+
if (pMetaDataImport == nullptr || mdType == mdTokenNil)
125+
return;
126+
127+
if (recursionDepth > 32)
128+
{
129+
pszName[0] = static_cast<WCHAR>(u'?');
130+
if (bufferLen > 1)
131+
pszName[1] = static_cast<WCHAR>(0);
132+
return;
133+
}
134+
135+
ULONG length = bufferLen;
136+
DWORD flags = 0;
137+
mdTypeDef mdBaseType = mdTypeDefNil;
138+
99139
auto hr = pMetaDataImport->GetTypeDefProps(mdType, pszName, length, &length, &flags, &mdBaseType);
140+
if (FAILED(hr))
141+
return;
100142

101143
if (!IsTdNested(flags) && numGenericTypeArgs == 0)
102144
{
@@ -106,14 +148,18 @@ inline void GetTypeName2(ICorProfilerInfo15 *pInfo, IMetaDataImport2 *pMetaDataI
106148
std::basic_string<WCHAR> out;
107149
if (IsTdNested(flags))
108150
{
109-
mdToken mdEnclosingClass;
110-
pMetaDataImport->GetNestedClassProps(mdType, &mdEnclosingClass);
111-
112-
std::vector<WCHAR> enclosing(bufferLen);
113-
enclosing[0] = static_cast<WCHAR>(0);
114-
GetTypeName2(pInfo, pMetaDataImport, mdEnclosingClass, numGenericTypeArgs, genericTypeArgs, enclosing.data(), bufferLen);
115-
out += enclosing.data();
116-
out += static_cast<WCHAR>(u'+');
151+
mdToken mdEnclosingClass = mdTokenNil;
152+
if (SUCCEEDED(pMetaDataImport->GetNestedClassProps(mdType, &mdEnclosingClass)) && mdEnclosingClass != mdTokenNil && mdEnclosingClass != mdType)
153+
{
154+
std::vector<WCHAR> enclosing(bufferLen);
155+
enclosing[0] = static_cast<WCHAR>(0);
156+
GetTypeName2(pInfo, pMetaDataImport, mdEnclosingClass, numGenericTypeArgs, genericTypeArgs, enclosing.data(), bufferLen, recursionDepth + 1);
157+
if (enclosing[0] != static_cast<WCHAR>(0))
158+
{
159+
out += enclosing.data();
160+
out += static_cast<WCHAR>(u'+');
161+
}
162+
}
117163
}
118164
if (numGenericTypeArgs > 0)
119165
{
@@ -124,12 +170,24 @@ inline void GetTypeName2(ICorProfilerInfo15 *pInfo, IMetaDataImport2 *pMetaDataI
124170

125171
for (size_t currentGenericArg = 0; currentGenericArg < numGenericTypeArgs; currentGenericArg++)
126172
{
127-
ClassID argClassId = genericTypeArgs[currentGenericArg];
128-
ModuleID argModuleId;
129-
pInfo->GetClassIDInfo2(argClassId, &argModuleId, NULL, 0, NULL, NULL, NULL);
173+
ClassID argClassId = (genericTypeArgs != nullptr) ? genericTypeArgs[currentGenericArg] : 0;
130174
WCHAR argTypeName[260];
131-
GetTypeName(pInfo, pMetaDataImport, argClassId, argModuleId, argTypeName, 260);
132-
out += argTypeName;
175+
argTypeName[0] = static_cast<WCHAR>(0);
176+
177+
if (pInfo != nullptr && argClassId != 0)
178+
{
179+
ModuleID argModuleId = 0;
180+
if (SUCCEEDED(pInfo->GetClassIDInfo2(argClassId, &argModuleId, NULL, 0, NULL, NULL, NULL)) && argModuleId != 0)
181+
{
182+
// Always resolve generic arg names with metadata from its own module.
183+
GetTypeName(pInfo, nullptr, argClassId, argModuleId, argTypeName, ARRAY_LEN(argTypeName));
184+
}
185+
}
186+
187+
if (argTypeName[0] != static_cast<WCHAR>(0))
188+
out += argTypeName;
189+
else
190+
out += static_cast<WCHAR>(u'?');
133191

134192
if (currentGenericArg < numGenericTypeArgs - 1)
135193
{

0 commit comments

Comments
 (0)