From: Mike McLaughlin Date: Wed, 26 Jun 2019 00:23:51 +0000 (-0700) Subject: Add _EFN_GetManagedThread for !analyze X-Git-Tag: submit/tizen/20190813.035844~4^2^2~19^2~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6d8984f88fcf5d7bf6249076d9a0f02f9909a3e9;p=platform%2Fcore%2Fdotnet%2Fdiagnostics.git Add _EFN_GetManagedThread for !analyze Instead of reading "gCurrentThreadInfo.m_pThread" in the runtime. --- diff --git a/eng/Versions.props b/eng/Versions.props index 29e40edb5..48b13959c 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -3,7 +3,7 @@ https://github.com/dotnet/diagnostics preview6 - 1.0.4 + 1.0.5 true diff --git a/src/SOS/Strike/sos.def b/src/SOS/Strike/sos.def index cebf92cc0..bb1a2c51f 100644 --- a/src/SOS/Strike/sos.def +++ b/src/SOS/Strike/sos.def @@ -191,6 +191,8 @@ EXPORTS _EFN_GetManagedObjectFieldInfo _EFN_GetManagedObjectName _EFN_StackTrace + _EFN_GetManagedThread + VerifyGMT bpmd BPMD=bpmd DebugExtensionInitialize diff --git a/src/SOS/Strike/sos_stacktrace.h b/src/SOS/Strike/sos_stacktrace.h index 0af241ca3..a9a54cf20 100644 --- a/src/SOS/Strike/sos_stacktrace.h +++ b/src/SOS/Strike/sos_stacktrace.h @@ -166,6 +166,16 @@ HRESULT CALLBACK _EFN_GetManagedObjectFieldInfo( PULONG pOffset ); +// _EFN_GetManagedThread - return the managed thread object for the os thread id +// +// osThreadId - os thread id +// pManagedObject - managed thread object returned +HRESULT CALLBACK _EFN_GetManagedThread( + PDEBUG_CLIENT client, + ULONG osThreadId, + PULONG64 pManagedObject +); + #ifdef __cplusplus } #endif // __cplusplus : extern "C" diff --git a/src/SOS/Strike/strike.cpp b/src/SOS/Strike/strike.cpp index fa7212bd7..92b48188c 100644 --- a/src/SOS/Strike/strike.cpp +++ b/src/SOS/Strike/strike.cpp @@ -15362,6 +15362,74 @@ _EFN_GetManagedObjectFieldInfo( return S_OK; } +DECLARE_API(VerifyGMT) +{ + ULONG osThreadId; + { + INIT_API(); + + CMDValue arg[] = + { // vptr, type + {&osThreadId, COHEX}, + }; + size_t nArg; + + if (!GetCMDOption(args, NULL, 0, arg, _countof(arg), &nArg)) + { + return Status; + } + } + ULONG64 managedObject; + HRESULT hr = _EFN_GetManagedThread(client, osThreadId, &managedObject); + { + INIT_API(); + + if (SUCCEEDED(hr)) { + ExtOut("%08x %p\n", osThreadId, managedObject); + } + else { + ExtErr("_EFN_GetManagedThread FAILED %08x\n", hr); + } + } + return hr; +} + +HRESULT CALLBACK +_EFN_GetManagedThread( + PDEBUG_CLIENT client, + ULONG osThreadId, + PULONG64 pManagedObject) +{ + INIT_API(); + + _ASSERTE(pManagedObject != nullptr); + *pManagedObject = 0; + + DacpThreadStoreData threadStore; + if ((Status = threadStore.Request(g_sos)) != S_OK) + { + return Status; + } + + CLRDATA_ADDRESS curThread = threadStore.firstThread; + while (curThread) + { + DacpThreadData thread; + if ((Status = thread.Request(g_sos, curThread)) != S_OK) + { + return Status; + } + if (thread.osThreadId == osThreadId) + { + *pManagedObject = (ULONG64)curThread; + return S_OK; + } + curThread = thread.nextThread; + } + + return E_INVALIDARG; +} + #endif // FEATURE_PAL //