2011-10-13 37 views
5

我想知道是否有工具,可以大量多线程应用程序的可视化多线程C++应用程序调用图,多线程代码覆盖率的工具?

  • 帮助可视调用图。
  • 具体而言,我想了解多个线程在一个内核上如何交错/在多个内核上同时执行。
  • 该工具将理想地识别可能的等待/死锁/竞态条件。
  • 最终我想根据线程在运行时(多线程代码覆盖率工具)如何交互以便找到潜在的多线程错误来进行代码覆盖。

    我很抱歉,如果我没有清楚解释我的问题,我很乐意提供任何细节。

+0

祝你好运,我会关注一个合理的答案。我认为你需要全面了解你正在分裂为多个执行线程。有许多工具可用于剖析和制作执行图(红格盖特的性能分析器,价格昂贵但很棒),但没有具体细节,您可以在黑暗中拍摄。 – Justin

+0

@Justin啊我忘了提及我正在使用的应用程序是用C++编写的。 – fantasticsid

+0

@fantasticid:我编辑了你的标题以反映你的兴趣。 –

回答

1

英特尔的VTune Profiler可以做一些你所要求的。从使用VTune网站:

锁定与等待:使用英特尔的性能分析工具来快速查找的性能降低的常见原因在并行程序:等待太久的锁,而内核是等待过程中得到充分利用。

时间线可视化线程行为:查看线程何时正在运行并等待以及何时发生转换。

如果你正在寻找一些开源/免费的东西,那么Valgrind有一个名为Helgrind的实验工具,它可以在多线程程序中找到竞争对手。我无法评论它,我没有使用它。

我应该注意到,我还没有成功地利用这些或其他分析器进行多线程调试和优化,而是我开发了自己的技术。

为了识别锁争用,我的首选技术是使用一个扩展的Mutex类,它记录在每个实例上完成的所有操作。我以一种非常轻量级的方式来做到这一点,以便应用程序性能不会发生很大变化。

为了识别竞争条件,我发现蛮力方法最好。我只是设计一个可以长时间运行的测试,有时这是几个小时或几天,具体情况取决于具体情况。我总是在至少两个不同的平台上运行我的测试(如果可以的话),因为不同的操作系统使用不同的调度程序,并且可以提供更好的覆盖范围。

1

虽然我对大多数问题都无能为力,但我认为我们的C++ Test Coverage工具可以轻松为您提供多线程测试覆盖率数据。

这个工具可以测试你的源代码;你编译并运行它。在代码中代表不同块的(廉价) 仪器探测器。仪器 记录了程序的哪个部分执行,名义上是每个仪器探测一个 位的位向量。在执行结束时(或者只要你喜欢),这个位矢量会被舍弃,并且一个查看器会将它显示给你,并叠加在代码上。

获得多线程测试覆盖范围的诀窍是知道我们为您提供完整的 控制权来定义仪器探测器的工作方式;他们是宏。因此,而不是使用 基本上

probe[n]=true; 

默认的宏布尔阵列上,可以改为一个int数组(或东西通过预先计算这个数值巧妙便宜)上实现

probe[n]|=1<<threadid; 

。 这可能只需要几行代码来实现。

人们可能会注意到这在技术上有同步问题。 确实如此,但最多只会丢失覆盖率数据的 ,并且与此相关的几率相当高。大多数人 对“相当不错”的数据感到满意,而非完美。如果您完全坚持 ,您将使用一些 原子更新指令支付较高的同步化价格。

我们还为您提供了对探针转储逻辑的控制;您可以修改它以写出 特定于线程的覆盖数据(在自定义代码范围的几十行中)。 测试覆盖率数据查看器会让您看到线程特定的覆盖范围 (只需选择正确的覆盖矢量);它也有内置的工具,可以很容易地计算/显示覆盖矢量上的十字路口/联合/差异 ,它可以准确地给出你的每线程覆盖率的关系。