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

Posted

技术标签:

【中文标题】如何使用 ETW 编写自定义堆栈跟踪【英文标题】:How to write a custom stack trace using ETW 【发布时间】:2017-07-08 17:28:12 【问题描述】:

Windows 事件跟踪 (ETW) 具有使用事件流捕获堆栈跟踪的功能。我假设它们是使用 EVENT_HEADER_EXT_TYPE_STACK_TRACE32(或 64)标头获取/编码的。但是,事件标头不受事件源 POV 的控制。

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

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

[顺便说一句,是的,我正在寻找拦截器,但是虽然现有的基础架构非常适合诊断已知的单个拦截器,但我需要了解一下,在这种情况下,事件关联还不够。此外,收集的数据很容易压倒我需要收集的设备。我的探测器要聪明得多,至少对我来说是这样。]

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

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

指点任何人?

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

不幸的是,这正是我已经在使用的功能,但它不适合一些边缘情况。

以上是关于如何使用 ETW 编写自定义堆栈跟踪的主要内容,如果未能解决你的问题,请参考以下文章

登录Julia时如何捕获完整的堆栈跟踪信息

Python:异常装饰器。如何保留堆栈跟踪

如何查看 CLR ETW 事件

学习TraceLogging事件,使用ETW记录,并使用WPA捕获和分析跟踪

自定义 JVM 语言:创建可行的堆栈跟踪?

如何使用来自 Microsoft-Windows-NDIS-PacketCapture 提供程序的实时 ETW 事件?