From d08317d36b9b2abacb2de68345d1c86908b24bf3 Mon Sep 17 00:00:00 2001 From: Koundinya Veluri Date: Sun, 15 May 2022 15:26:06 -0700 Subject: [PATCH 1/2] Update SOS to show thread pool work items from new queues - Depends on https://github.com/dotnet/runtime/pull/69386 - The PR above added new queues of work items. This change updates the `ThreadPool -wi` command to include showing work items from those new queues. - Verified that the updated SOS works with and without the above PR --- src/SOS/Strike/strike.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/SOS/Strike/strike.cpp b/src/SOS/Strike/strike.cpp index 0796420ceb..b53cd1349c 100644 --- a/src/SOS/Strike/strike.cpp +++ b/src/SOS/Strike/strike.cpp @@ -8371,6 +8371,29 @@ DECLARE_API(ThreadPool) } } + // Enumerate assignable normal-priority work items. + offset = GetObjFieldOffset(itr->GetAddress(), itr->GetMT(), W("assignableWorkItemQueues")); + if (offset > 0) + { + DWORD_PTR workItemsConcurrentQueueArrayPtr; + MOVE(workItemsConcurrentQueueArrayPtr, itr->GetAddress() + offset); + DacpObjectData workItemsConcurrentQueueArray; + if (workItemsConcurrentQueueArray.Request(g_sos, TO_CDADDR(workItemsConcurrentQueueArrayPtr)) == S_OK && + workItemsConcurrentQueueArray.ObjectType == OBJ_ARRAY) + { + for (int i = 0; i < workItemsConcurrentQueueArray.dwNumComponents; i++) + { + CLRDATA_ADDRESS workItemsConcurrentQueuePtr; + MOVE(workItemsConcurrentQueuePtr, TO_CDADDR(workItemsConcurrentQueueArray.ArrayDataPtr + (i * workItemsConcurrentQueueArray.dwComponentSize))); + if (workItemsConcurrentQueuePtr != NULL && sos::IsObject(workItemsConcurrentQueuePtr, false)) + { + // We got the ConcurrentQueue. Enumerate it. + EnumerateThreadPoolGlobalWorkItemConcurrentQueue(workItemsConcurrentQueuePtr, "[Global]", &stats); + } + } + } + } + // Enumerate normal-priority work items. offset = GetObjFieldOffset(itr->GetAddress(), itr->GetMT(), W("workItems")); if (offset > 0) From 818e9fb06a285fdce667569e43e33ca930357e2b Mon Sep 17 00:00:00 2001 From: Koundinya Veluri Date: Thu, 19 May 2022 09:56:58 -0700 Subject: [PATCH 2/2] Fix a few of things - Renamed a field based on feedback from the dependency PR - Fixed build break on x86 - Previously on x86 it looks like it was reading 8 bytes from an array element of pointer size and only using the lower 4 bytes. Fixed to read only pointer size in a few places. - Verified on x86 and x64 --- src/SOS/Strike/strike.cpp | 18 +++++++++--------- src/SOS/Strike/util.cpp | 10 +++++----- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/SOS/Strike/strike.cpp b/src/SOS/Strike/strike.cpp index b53cd1349c..8ccf832ee4 100644 --- a/src/SOS/Strike/strike.cpp +++ b/src/SOS/Strike/strike.cpp @@ -8372,7 +8372,7 @@ DECLARE_API(ThreadPool) } // Enumerate assignable normal-priority work items. - offset = GetObjFieldOffset(itr->GetAddress(), itr->GetMT(), W("assignableWorkItemQueues")); + offset = GetObjFieldOffset(itr->GetAddress(), itr->GetMT(), W("_assignableWorkItemQueues")); if (offset > 0) { DWORD_PTR workItemsConcurrentQueueArrayPtr; @@ -8383,9 +8383,9 @@ DECLARE_API(ThreadPool) { for (int i = 0; i < workItemsConcurrentQueueArray.dwNumComponents; i++) { - CLRDATA_ADDRESS workItemsConcurrentQueuePtr; - MOVE(workItemsConcurrentQueuePtr, TO_CDADDR(workItemsConcurrentQueueArray.ArrayDataPtr + (i * workItemsConcurrentQueueArray.dwComponentSize))); - if (workItemsConcurrentQueuePtr != NULL && sos::IsObject(workItemsConcurrentQueuePtr, false)) + DWORD_PTR workItemsConcurrentQueuePtr; + MOVE(workItemsConcurrentQueuePtr, workItemsConcurrentQueueArray.ArrayDataPtr + (i * workItemsConcurrentQueueArray.dwComponentSize)); + if (workItemsConcurrentQueuePtr != NULL && sos::IsObject(TO_CDADDR(workItemsConcurrentQueuePtr), false)) { // We got the ConcurrentQueue. Enumerate it. EnumerateThreadPoolGlobalWorkItemConcurrentQueue(workItemsConcurrentQueuePtr, "[Global]", &stats); @@ -8421,9 +8421,9 @@ DECLARE_API(ThreadPool) { for (int i = 0; i < workItemArray.dwNumComponents; i++) { - CLRDATA_ADDRESS workItemPtr; - MOVE(workItemPtr, TO_CDADDR(workItemArray.ArrayDataPtr + (i * workItemArray.dwComponentSize))); - if (workItemPtr != NULL && sos::IsObject(workItemPtr, false)) + DWORD_PTR workItemPtr; + MOVE(workItemPtr, workItemArray.ArrayDataPtr + (i * workItemArray.dwComponentSize)); + if (workItemPtr != NULL && sos::IsObject(TO_CDADDR(workItemPtr), false)) { sos::Object workItem = TO_TADDR(workItemPtr); stats.Add((DWORD_PTR)workItem.GetMT(), (DWORD)workItem.GetSize()); @@ -8431,10 +8431,10 @@ DECLARE_API(ThreadPool) if ((offset = GetObjFieldOffset(workItem.GetAddress(), workItem.GetMT(), W("_callback"))) > 0 || (offset = GetObjFieldOffset(workItem.GetAddress(), workItem.GetMT(), W("m_action"))) > 0) { - CLRDATA_ADDRESS delegatePtr; + DWORD_PTR delegatePtr; MOVE(delegatePtr, workItem.GetAddress() + offset); CLRDATA_ADDRESS md; - if (TryGetMethodDescriptorForDelegate(delegatePtr, &md)) + if (TryGetMethodDescriptorForDelegate(TO_CDADDR(delegatePtr), &md)) { NameForMD_s((DWORD_PTR)md, g_mdName, mdNameLen); ExtOut(" => %S", g_mdName); diff --git a/src/SOS/Strike/util.cpp b/src/SOS/Strike/util.cpp index fe69ec024f..2b2db91c1f 100644 --- a/src/SOS/Strike/util.cpp +++ b/src/SOS/Strike/util.cpp @@ -6035,9 +6035,9 @@ void EnumerateThreadPoolGlobalWorkItemConcurrentQueue( { for (int i = 0; i < slotsArray.dwNumComponents; i++) { - CLRDATA_ADDRESS workItemPtr; - MOVE(workItemPtr, TO_CDADDR(slotsArray.ArrayDataPtr + (i * slotsArray.dwComponentSize))); // the item object reference is at the beginning of the Slot - if (workItemPtr != NULL && sos::IsObject(workItemPtr, false)) + DWORD_PTR workItemPtr; + MOVE(workItemPtr, slotsArray.ArrayDataPtr + (i * slotsArray.dwComponentSize)); // the item object reference is at the beginning of the Slot + if (workItemPtr != NULL && sos::IsObject(TO_CDADDR(workItemPtr), false)) { sos::Object workItem = TO_TADDR(workItemPtr); stats->Add((DWORD_PTR)workItem.GetMT(), (DWORD)workItem.GetSize()); @@ -6045,10 +6045,10 @@ void EnumerateThreadPoolGlobalWorkItemConcurrentQueue( if ((offset = GetObjFieldOffset(workItem.GetAddress(), workItem.GetMT(), W("_callback"))) > 0 || (offset = GetObjFieldOffset(workItem.GetAddress(), workItem.GetMT(), W("m_action"))) > 0) { - CLRDATA_ADDRESS delegatePtr; + DWORD_PTR delegatePtr; MOVE(delegatePtr, workItem.GetAddress() + offset); CLRDATA_ADDRESS md; - if (TryGetMethodDescriptorForDelegate(delegatePtr, &md)) + if (TryGetMethodDescriptorForDelegate(TO_CDADDR(delegatePtr), &md)) { NameForMD_s((DWORD_PTR)md, g_mdName, mdNameLen); ExtOut(" => %S", g_mdName);