如何使用 ETW 编写自定义堆栈跟踪

How to write a custom stack trace using ETW

Windows 的事件跟踪 (ETW) 具有使用事件流捕获堆栈跟踪的功能。我假设他们是 fetched/encoded 使用 EVENT_HEADER_EXT_TYPE_STACK_TRACE32(或 64)header。但是,事件 header 不受事件源 POV 的控制。

https://msdn.microsoft.com/en-us/library/windows/desktop/aa363760%28v=vs.85%29.aspx

在我的 .net 应用程序中,我有一个特定的条件,我在另一个线程(UI 线程)中通过观察它来诊断它。我可以收集暴露条件的堆栈跟踪,数据片段就位,但我想使用 ETW 及其工具链进行进一步分析。

[顺便说一句,是的,我正在寻找阻滞剂,但虽然现有的基础设施非常适合诊断已知的单个阻滞剂,但我需要获得一个概览,并且在这种情况下事件关联是不够的。此外,收集的数据很容易使我需要收集的设备不堪重负。我的检测器更智能,至少对我来说是这样。]

所以我正在寻找(按优先顺序)

  1. 一种将我收集的堆栈替换为事件的方法 header
  2. 为堆栈跟踪使用另一个属性,以及一种方法 告诉工具(perfview 或 xperf)改用这个
  3. 一种方法 在没有 ETW 的情况下(但在 .net 中)写入 ETW .etl 兼容文件,并使用完整的 控制 header(我不需要实时功能)

有人指点吗?

我选择了选项 4:使用完全不同的格式,至少有一个工具可以摄取和分析。在这种情况下,一个 .perfView.xml 文件被写入并完成了工作,尽管分析功能不如我所希望的那样好。

为此使用隐藏的 etw 命令:
‘Hidden’ ETW Stack Trace Feature – Get Stacks All Over the Place!