-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcor_profiler_base.h
210 lines (190 loc) · 13.5 KB
/
cor_profiler_base.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef OTEL_CLR_PROFILER_COR_PROFILER_BASE_H_
#define OTEL_CLR_PROFILER_COR_PROFILER_BASE_H_
#include <atomic>
#include <corhlpr.h>
#include <corprof.h>
namespace trace
{
class CorProfilerBase : public ICorProfilerCallback10
{
private:
std::atomic<int> ref_count_;
protected:
ICorProfilerInfo7* info_;
ICorProfilerInfo12* info12_;
public:
CorProfilerBase();
virtual ~CorProfilerBase();
HRESULT STDMETHODCALLTYPE Initialize(IUnknown* pICorProfilerInfoUnk) override;
HRESULT STDMETHODCALLTYPE Shutdown() override;
HRESULT STDMETHODCALLTYPE AppDomainCreationStarted(AppDomainID appDomainId) override;
HRESULT STDMETHODCALLTYPE AppDomainCreationFinished(AppDomainID appDomainId, HRESULT hrStatus) override;
HRESULT STDMETHODCALLTYPE AppDomainShutdownStarted(AppDomainID appDomainId) override;
HRESULT STDMETHODCALLTYPE AppDomainShutdownFinished(AppDomainID appDomainId, HRESULT hrStatus) override;
HRESULT STDMETHODCALLTYPE AssemblyLoadStarted(AssemblyID assemblyId) override;
HRESULT STDMETHODCALLTYPE AssemblyLoadFinished(AssemblyID assemblyId, HRESULT hrStatus) override;
HRESULT STDMETHODCALLTYPE AssemblyUnloadStarted(AssemblyID assemblyId) override;
HRESULT STDMETHODCALLTYPE AssemblyUnloadFinished(AssemblyID assemblyId, HRESULT hrStatus) override;
HRESULT STDMETHODCALLTYPE ModuleLoadStarted(ModuleID moduleId) override;
HRESULT STDMETHODCALLTYPE ModuleLoadFinished(ModuleID moduleId, HRESULT hrStatus) override;
HRESULT STDMETHODCALLTYPE ModuleUnloadStarted(ModuleID moduleId) override;
HRESULT STDMETHODCALLTYPE ModuleUnloadFinished(ModuleID moduleId, HRESULT hrStatus) override;
HRESULT STDMETHODCALLTYPE ModuleAttachedToAssembly(ModuleID moduleId, AssemblyID AssemblyId) override;
HRESULT STDMETHODCALLTYPE ClassLoadStarted(ClassID classId) override;
HRESULT STDMETHODCALLTYPE ClassLoadFinished(ClassID classId, HRESULT hrStatus) override;
HRESULT STDMETHODCALLTYPE ClassUnloadStarted(ClassID classId) override;
HRESULT STDMETHODCALLTYPE ClassUnloadFinished(ClassID classId, HRESULT hrStatus) override;
HRESULT STDMETHODCALLTYPE FunctionUnloadStarted(FunctionID functionId) override;
HRESULT STDMETHODCALLTYPE JITCompilationStarted(FunctionID functionId, BOOL fIsSafeToBlock) override;
HRESULT STDMETHODCALLTYPE JITCompilationFinished(FunctionID functionId, HRESULT hrStatus,
BOOL fIsSafeToBlock) override;
HRESULT STDMETHODCALLTYPE JITCachedFunctionSearchStarted(FunctionID functionId, BOOL* pbUseCachedFunction) override;
HRESULT STDMETHODCALLTYPE JITCachedFunctionSearchFinished(FunctionID functionId, COR_PRF_JIT_CACHE result) override;
HRESULT STDMETHODCALLTYPE JITFunctionPitched(FunctionID functionId) override;
HRESULT STDMETHODCALLTYPE JITInlining(FunctionID callerId, FunctionID calleeId, BOOL* pfShouldInline) override;
HRESULT STDMETHODCALLTYPE ThreadCreated(ThreadID threadId) override;
HRESULT STDMETHODCALLTYPE ThreadDestroyed(ThreadID threadId) override;
HRESULT STDMETHODCALLTYPE ThreadAssignedToOSThread(ThreadID managedThreadId, DWORD osThreadId) override;
HRESULT STDMETHODCALLTYPE RemotingClientInvocationStarted() override;
HRESULT STDMETHODCALLTYPE RemotingClientSendingMessage(GUID* pCookie, BOOL fIsAsync) override;
HRESULT STDMETHODCALLTYPE RemotingClientReceivingReply(GUID* pCookie, BOOL fIsAsync) override;
HRESULT STDMETHODCALLTYPE RemotingClientInvocationFinished() override;
HRESULT STDMETHODCALLTYPE RemotingServerReceivingMessage(GUID* pCookie, BOOL fIsAsync) override;
HRESULT STDMETHODCALLTYPE RemotingServerInvocationStarted() override;
HRESULT STDMETHODCALLTYPE RemotingServerInvocationReturned() override;
HRESULT STDMETHODCALLTYPE RemotingServerSendingReply(GUID* pCookie, BOOL fIsAsync) override;
HRESULT STDMETHODCALLTYPE UnmanagedToManagedTransition(FunctionID functionId,
COR_PRF_TRANSITION_REASON reason) override;
HRESULT STDMETHODCALLTYPE ManagedToUnmanagedTransition(FunctionID functionId,
COR_PRF_TRANSITION_REASON reason) override;
HRESULT STDMETHODCALLTYPE RuntimeSuspendStarted(COR_PRF_SUSPEND_REASON suspendReason) override;
HRESULT STDMETHODCALLTYPE RuntimeSuspendFinished() override;
HRESULT STDMETHODCALLTYPE RuntimeSuspendAborted() override;
HRESULT STDMETHODCALLTYPE RuntimeResumeStarted() override;
HRESULT STDMETHODCALLTYPE RuntimeResumeFinished() override;
HRESULT STDMETHODCALLTYPE RuntimeThreadSuspended(ThreadID threadId) override;
HRESULT STDMETHODCALLTYPE RuntimeThreadResumed(ThreadID threadId) override;
HRESULT STDMETHODCALLTYPE MovedReferences(ULONG cMovedObjectIDRanges, ObjectID oldObjectIDRangeStart[],
ObjectID newObjectIDRangeStart[], ULONG cObjectIDRangeLength[]) override;
HRESULT STDMETHODCALLTYPE ObjectAllocated(ObjectID objectId, ClassID classId) override;
HRESULT STDMETHODCALLTYPE ObjectsAllocatedByClass(ULONG cClassCount, ClassID classIds[], ULONG cObjects[]) override;
HRESULT STDMETHODCALLTYPE ObjectReferences(ObjectID objectId, ClassID classId, ULONG cObjectRefs,
ObjectID objectRefIds[]) override;
HRESULT STDMETHODCALLTYPE RootReferences(ULONG cRootRefs, ObjectID rootRefIds[]) override;
HRESULT STDMETHODCALLTYPE ExceptionThrown(ObjectID thrownObjectId) override;
HRESULT STDMETHODCALLTYPE ExceptionSearchFunctionEnter(FunctionID functionId) override;
HRESULT STDMETHODCALLTYPE ExceptionSearchFunctionLeave() override;
HRESULT STDMETHODCALLTYPE ExceptionSearchFilterEnter(FunctionID functionId) override;
HRESULT STDMETHODCALLTYPE ExceptionSearchFilterLeave() override;
HRESULT STDMETHODCALLTYPE ExceptionSearchCatcherFound(FunctionID functionId) override;
HRESULT STDMETHODCALLTYPE ExceptionOSHandlerEnter(UINT_PTR __unused) override;
HRESULT STDMETHODCALLTYPE ExceptionOSHandlerLeave(UINT_PTR __unused) override;
HRESULT STDMETHODCALLTYPE ExceptionUnwindFunctionEnter(FunctionID functionId) override;
HRESULT STDMETHODCALLTYPE ExceptionUnwindFunctionLeave() override;
HRESULT STDMETHODCALLTYPE ExceptionUnwindFinallyEnter(FunctionID functionId) override;
HRESULT STDMETHODCALLTYPE ExceptionUnwindFinallyLeave() override;
HRESULT STDMETHODCALLTYPE ExceptionCatcherEnter(FunctionID functionId, ObjectID objectId) override;
HRESULT STDMETHODCALLTYPE ExceptionCatcherLeave() override;
HRESULT STDMETHODCALLTYPE COMClassicVTableCreated(ClassID wrappedClassId, REFGUID implementedIID, void* pVTable,
ULONG cSlots) override;
HRESULT STDMETHODCALLTYPE COMClassicVTableDestroyed(ClassID wrappedClassId, REFGUID implementedIID,
void* pVTable) override;
HRESULT STDMETHODCALLTYPE ExceptionCLRCatcherFound() override;
HRESULT STDMETHODCALLTYPE ExceptionCLRCatcherExecute() override;
HRESULT STDMETHODCALLTYPE ThreadNameChanged(ThreadID threadId, ULONG cchName, WCHAR name[]) override;
HRESULT STDMETHODCALLTYPE GarbageCollectionStarted(int cGenerations, BOOL generationCollected[],
COR_PRF_GC_REASON reason) override;
HRESULT STDMETHODCALLTYPE SurvivingReferences(ULONG cSurvivingObjectIDRanges, ObjectID objectIDRangeStart[],
ULONG cObjectIDRangeLength[]) override;
HRESULT STDMETHODCALLTYPE GarbageCollectionFinished() override;
HRESULT STDMETHODCALLTYPE FinalizeableObjectQueued(DWORD finalizerFlags, ObjectID objectID) override;
HRESULT STDMETHODCALLTYPE RootReferences2(ULONG cRootRefs, ObjectID rootRefIds[], COR_PRF_GC_ROOT_KIND rootKinds[],
COR_PRF_GC_ROOT_FLAGS rootFlags[], UINT_PTR rootIds[]) override;
HRESULT STDMETHODCALLTYPE HandleCreated(GCHandleID handleId, ObjectID initialObjectId) override;
HRESULT STDMETHODCALLTYPE HandleDestroyed(GCHandleID handleId) override;
HRESULT STDMETHODCALLTYPE InitializeForAttach(IUnknown* pCorProfilerInfoUnk, void* pvClientData,
UINT cbClientData) override;
HRESULT STDMETHODCALLTYPE ProfilerAttachComplete() override;
HRESULT STDMETHODCALLTYPE ProfilerDetachSucceeded() override;
HRESULT STDMETHODCALLTYPE ReJITCompilationStarted(FunctionID functionId, ReJITID rejitId,
BOOL fIsSafeToBlock) override;
HRESULT STDMETHODCALLTYPE GetReJITParameters(ModuleID moduleId, mdMethodDef methodId,
ICorProfilerFunctionControl* pFunctionControl) override;
HRESULT STDMETHODCALLTYPE ReJITCompilationFinished(FunctionID functionId, ReJITID rejitId, HRESULT hrStatus,
BOOL fIsSafeToBlock) override;
HRESULT STDMETHODCALLTYPE ReJITError(ModuleID moduleId, mdMethodDef methodId, FunctionID functionId,
HRESULT hrStatus) override;
HRESULT STDMETHODCALLTYPE MovedReferences2(ULONG cMovedObjectIDRanges, ObjectID oldObjectIDRangeStart[],
ObjectID newObjectIDRangeStart[],
SIZE_T cObjectIDRangeLength[]) override;
HRESULT STDMETHODCALLTYPE SurvivingReferences2(ULONG cSurvivingObjectIDRanges, ObjectID objectIDRangeStart[],
SIZE_T cObjectIDRangeLength[]) override;
HRESULT STDMETHODCALLTYPE ConditionalWeakTableElementReferences(ULONG cRootRefs, ObjectID keyRefIds[],
ObjectID valueRefIds[],
GCHandleID rootIds[]) override;
HRESULT STDMETHODCALLTYPE GetAssemblyReferences(const WCHAR* wszAssemblyPath,
ICorProfilerAssemblyReferenceProvider* pAsmRefProvider) override;
HRESULT STDMETHODCALLTYPE ModuleInMemorySymbolsUpdated(ModuleID moduleId) override;
HRESULT STDMETHODCALLTYPE DynamicMethodJITCompilationStarted(FunctionID functionId, BOOL fIsSafeToBlock,
LPCBYTE ilHeader, ULONG cbILHeader) override;
HRESULT STDMETHODCALLTYPE DynamicMethodJITCompilationFinished(FunctionID functionId, HRESULT hrStatus,
BOOL fIsSafeToBlock) override;
HRESULT STDMETHODCALLTYPE DynamicMethodUnloaded(FunctionID functionId) override;
HRESULT STDMETHODCALLTYPE EventPipeEventDelivered(EVENTPIPE_PROVIDER provider, DWORD eventId, DWORD eventVersion,
ULONG cbMetadataBlob, LPCBYTE metadataBlob, ULONG cbEventData,
LPCBYTE eventData, LPCGUID pActivityId,
LPCGUID pRelatedActivityId, ThreadID eventThread,
ULONG numStackFrames, UINT_PTR stackFrames[]) override;
HRESULT STDMETHODCALLTYPE EventPipeProviderCreated(EVENTPIPE_PROVIDER provider) override;
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject) override
{
if (riid == __uuidof(ICorProfilerCallback10) || riid == __uuidof(ICorProfilerCallback9) ||
riid == __uuidof(ICorProfilerCallback8) || riid == __uuidof(ICorProfilerCallback7) ||
riid == __uuidof(ICorProfilerCallback6) || riid == __uuidof(ICorProfilerCallback5) ||
riid == __uuidof(ICorProfilerCallback4) || riid == __uuidof(ICorProfilerCallback3) ||
riid == __uuidof(ICorProfilerCallback2) || riid == __uuidof(ICorProfilerCallback) || riid == IID_IUnknown)
{
*ppvObject = this;
this->AddRef();
return S_OK;
}
*ppvObject = nullptr;
return E_NOINTERFACE;
}
ULONG STDMETHODCALLTYPE AddRef(void) override
{
return std::atomic_fetch_add(&this->ref_count_, 1) + 1;
}
ULONG STDMETHODCALLTYPE Release(void) override
{
int count = std::atomic_fetch_sub(&this->ref_count_, 1) - 1;
/*
* Running netcoreapp2.x we get in similar scenarios as the one described in:
* https://github.com/dotnet/runtime/issues/11885
*
* A crash while profiler is shutting down because one thread can be deleting the
* profiler instance while another thread can be trying to call
* `EEToProfInterfaceImpl::JITCompilationFinished`
* and crashing here https://github.com/dotnet/coreclr/blob/release/2.1/src/vm/eetoprofinterfaceimpl.cpp#L3220
* as seen in several memory dumps.
*
* One way to avoid the crash is by skipping the deletion of the profiler,
* so the pointer doesn't get invalidated. So we are commenting the `delete this;` line.
*
* This behavior appears to be fixed in netcoreapp3.x as seen in the commit:
* https://github.com/dotnet/coreclr/commit/671772c20a27c050df3d7d11391ea4f7de05165c
* PR:
* https://github.com/dotnet/coreclr/pull/22712
*/
// if (count <= 0) {
// delete this;
//}
return count;
}
};
} // namespace trace
#endif // OTEL_CLR_PROFILER_PROFILER_BASE_H_