Large offsets
clr.dll!LogHelp_TerminateOnAssert+0x6835
means that the actual execution in that method is 0x6835 = 26661 bytes away from its beginning. It's unlikely that a method is that big. (As @blabb points out, it's a 1 byte method).
Usually you see that when you have not set up the symbols correctly (like in the linked original question), but you have that fixed.
Chances are that Microsoft has only release the public symbols of clr.dll
and not the private ones. In that case, you'll only see the last known public method.
Start address
Please note that the column is named "Start address". Process Explorer will show the first entry on the stack.
So this is where everything starts. You seem to be concerned that this is where everything ends.
Note: some known internal methods like RtlUserThreadStart
and BaseThreadInitThunk
will be skipped when displaying the start address. Otherwise they'd probably all look the same.
What the thread is really doing is on the top of the list, i.e. ZwRemoveIoCompletion
, so it seems to do some IO operation.
Your questions
Should I be concerned with the large number of LogHelp_TerminateOnAssert calls?
No. These are just the starting point for something good. The GetQueuedCompletionStatus()
looks like there's some IO going on and .NET uses IO Completion Ports (IOCP) for you.
Is the application leaking memory?
You don't tell that from a look at call stacks. You tell that by looking at the memory over time.
If you have too much network IO going on and the network can't keep up with it, .NET may have more and more items in the queue, so it may look like a memory leak.
Does it have an excessive number of exceptions that don't filter down when I am running the app in Visual Studio?
You would also not tell that from the call stack. You would attach a debugger (e.g. WinDbg) and check for exceptions (like sxe clr
), if you don't trust Visual Studio.