【发布时间】: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