【问题标题】:Tracing ETW during NUnit runs在 NUnit 运行期间跟踪 ETW
【发布时间】:2015-03-19 17:56:40
【问题描述】:

我正在开发一个多线程应用程序,我知道我的应用程序中存在某种竞争条件/死锁,因为每隔一段时间,我的一个单元测试就会卡住并且永远无法完成(现在我已经解决了这个问题使用 NUnit Timeout 属性)。当我调试测试时,我永远无法复制它。

我已将 ETW 跟踪编码到我的应用程序中,这肯定有助于调试此问题。问题是要进行 ETW 跟踪,应用程序必须由 PerfView 或另一个与跟踪下的应用程序共享内存的应用程序启动(据我所知)。

我的问题是:有谁知道运行 NUnit 测试并将 ETW 跟踪事件记录在单独的文件中以便以后通过 PerfView 运行的方法?这样,每当我看到我的测试失败时,我都可以查看该运行的跟踪并分析以了解发生了什么。附带说明一下,我正在使用 Resharper 的 NUnit 运行器。

欢迎任何其他方法/技术。感谢您的反馈。

【问题讨论】:

  • Perfview 已经将数据记录到 ETL 文件中
  • 是的,但它需要在单个进程中完成 - 您使用 PerfView 运行应用程序并记录数据。我想在使用 NUnit 运行测试期间记录数据,稍后使用 PerfView 查看数据。
  • 应用程序不需要通过 perfview 运行。 ETW 数据是在机器范围内收集的,而不是按应用程序收集的。您可以在测试机器上通过 perfmon 或 logman 设置收集器,然后使用 perfview 对其进行分析。
  • 谢谢。您知道使用 perfmon 设置收集器部分的任何教程吗?我会想办法做到这一点。
  • 如果您创建自己的个人资料 (msdn.microsoft.com/en-us/library/windows/hardware/hh448223.aspx),您可以通过 xperf 或 WPR 捕获自己的事件,但这太丑陋了。

标签: c# multithreading nunit resharper etw


【解决方案1】:
  • 编写一个简单的实现 EventListener那个 为您有兴趣收听的提供商收集 ETW 跟踪。
  • 转储 手动将存储的跟踪内容保存到文件中或使用某些库(例如,您可以将日志集合序列化为 JSON 字符串并将其写入文本文件),甚至验证存储的事件作为测试验证的一部分。李>
  • 更新您的测试以使用该侦听器。

在这种情况下,您可以在构建控制器机器上拥有带有跟踪创建事件的文件,您可能没有使用 logman/PerfMon 的权限/访问权限。

【讨论】:

    猜你喜欢
    • 2019-02-25
    • 2019-04-24
    • 1970-01-01
    • 2019-06-03
    • 2012-06-12
    • 2012-08-29
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    相关资源
    最近更新 更多