Freigeben über


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]