Getting a list of all the subscribers to an event with WinDbg and SOS
I was wondering and Lee Culver from the CLR Quick Response Team was kind enough to give me an answer. The output below is for CLR V4 so the format might be a bit different than V2. "The debugging session below was identical in v2 except for SOS formatting differences."
Enjoy and thanks Lee!
There’s no magic to it, you just walk the object until you find what you are looking for. This object has an event called Foo:
0:000> !do 0000000002dabe68
Name: Test
MethodTable: 000007ff00044700
EEClass: 000007ff00162510
Size: 24(0x18) bytes
File: D:\dd\clr\src\binaries\AMD64chk\events.exe
Fields:
MT Field Offset Type VT Attr Value Name
000007ff00044b48 4000001 8 Test+T 0 instance 0000000002dabf48 Foo
0:000> !do 0000000002dabf48
Name: Test+T
MethodTable: 000007ff00044b48
EEClass: 000007ff001629e8
Size: 64(0x40) bytes
File: D:\dd\clr\src\binaries\AMD64chk\events.exe
Fields:
MT Field Offset Type VT Attr Value Name
000007feef8b3bc0 4000046 8 System.Object 0 instance 0000000002dabf48 _target
000007feef8b3bc0 4000047 10 System.Object 0 instance 0000000000000000 _methodBase
000007feef8b7388 4000048 18 System.IntPtr 1 instance 7ff0003aca8 _methodPtr
000007feef8b7388 4000049 20 System.IntPtr 1 instance 7ff00044a10 _methodPtrAux
000007feef8b3bc0 400004a 28 System.Object 0 instance 0000000002dabf18 _invocationList
000007feef8b7388 400004b 30 System.IntPtr 1 instance 2 _invocationCount
This has the object (_target), a method pointer (!dumpmd on _methodPtrAux or if it’s null, ln on _methodPtr), and an optional invocation list. If the event has multiple subscribers, then _invocationList will be non-null:
0:000> !da -details 0000000002dabf18
Name: System.Object[]
MethodTable: 000007feef89b3c8
EEClass: 000007feeef17718
Size: 48(0x30) bytes
Array: Rank 1, Number of elements 2, Type CLASS
Element Methodtable: 000007feef8b3bc0
[snip tons of output, all of your subscribers here]