当嵌入式 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
解析
最初在那里回答:
更新:
由于跟踪 WPF 操作,我会说具有可变 ID 的方法是有史以来最糟糕的实现。它实施不正确。
Id在收集Id的过程中有固定的地址位置,但整个操作不能确保跟踪消息包含正确的地址。引发事件时它可能已经移动。
我得到下一个事件序列:
- WClientUIContextPost
- GCBulkMovedObjectRanges
- WClientUIContextPost
最后一个可能包含已移动或未移动的 Id。只有神知道。
事件 GCBulkMovedObjectRanges 的可用率为 95%。但有时会失败。
因此无法可靠地跟踪它。非常遗憾,这个 architectural/implementation 错误导致功能无法使用。
我正在尝试通过嵌入到 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
最初在那里回答:
更新:
由于跟踪 WPF 操作,我会说具有可变 ID 的方法是有史以来最糟糕的实现。它实施不正确。
Id在收集Id的过程中有固定的地址位置,但整个操作不能确保跟踪消息包含正确的地址。引发事件时它可能已经移动。
我得到下一个事件序列:
- WClientUIContextPost
- GCBulkMovedObjectRanges
- WClientUIContextPost
最后一个可能包含已移动或未移动的 Id。只有神知道。
事件 GCBulkMovedObjectRanges 的可用率为 95%。但有时会失败。
因此无法可靠地跟踪它。非常遗憾,这个 architectural/implementation 错误导致功能无法使用。