当嵌入式 ETW 提供程序跟踪 WPF 操作时,操作 ID 是可变的

Operation Id is changeable when trace WPF operations by embedded ETW provider

我正在尝试通过嵌入到 PresentationSource 中的 ETW 提供程序来跟踪 WPF 操作。 当我跟踪实际应用程序时,我通过将已触发的操作 ID 从 Post 更改为 Start phase.

在源代码中我发现Id依赖于对象的地址,在GC操作期间可能会改变: https://referencesource.microsoft.com/#windowsbase/Base/System/Windows/Threading/DispatcherOperation.cs,dff34e59b0cffd1e

有人知道如何通过 ETW 跟踪此类对象重定位吗?

此类移动可能会被以下人员跟踪:

提供商名称:"Microsoft-Windows-DotNETRuntime"
事件名称:"GC/GCBulkMovedObjectRanges"
事件可能被 ClrTraceEventParser.GCBulkMovedObjectRanges

解析

最初在那里回答:

https://social.msdn.microsoft.com/Forums/en-US/7b6f9918-60ee-4e23-b443-42b4895775ad/how-to-track-change-of-wpf-dispatcheroperation-id?forum=netfxbcl

更新:

由于跟踪 WPF 操作,我会说具有可变 ID 的方法是有史以来最糟糕的实现。它实施不正确。

Id在收集Id的过程中有固定的地址位置,但整个操作不能确保跟踪消息包含正确的地址。引发事件时它可能已经移动。

我得到下一个事件序列:
- WClientUIContextPost
- GCBulkMovedObjectRanges
- WClientUIContextPost

最后一个可能包含已移动或未移动的 Id。只有神知道。

事件 GCBulkMovedObjectRanges 的可用率为 95%。但有时会失败。

因此无法可靠地跟踪它。非常遗憾,这个 architectural/implementation 错误导致功能无法使用。