可视化多线程C ++应用程序调用图,多线程代码覆盖的工具?

时间:2011-10-13 03:21:10

标签: multithreading testing code-coverage deadlock call-graph

我想知道是否有工具可以

  • 帮助可视化大型多线程应用程序的调用图。
  • 具体来说,我想看看多个线程如何在一个内核上交错/在多个内核上同时执行。
  • 该工具可以理想地识别可能的等待/死锁/竞争条件。
  • 最终,我希望根据线程在运行时(多线程代码覆盖工具)之间如何相互交互来进行代码覆盖,以便找到潜在的多线程错误。

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

3 个答案:

答案 0 :(得分:1)

英特尔的VTune Profiler可以完成您的一些要求。来自VTune网站:

锁定和等待:使用英特尔®性能分析工具快速找到并行程序性能降低的常见原因:在等待期间内核未充分利用时,等待锁定时间过长。 / p>

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

如果您正在寻找开源/免费的东西,那么Valgrind有一个名为Helgrind的实验工具,可以在多线程程序中找到比赛。我无法发表评论,我还没有用过。

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

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

为了确定竞争条件,我发现蛮力接近最佳状态。我只是设计了一个可以运行很长一段时间的测试,有时这是几小时或几天,具体取决于具体情况。而且我总是在至少两个不同的平台上运行我的测试(如果可以的话,我会更多),因为不同的操作系统使用不同的调度程序,这样可以提供更好的覆盖率。

答案 1 :(得分:1)

虽然我对大多数问题都无法帮助(但是!),我认为我们的C++ Test Coverage工具可以非常轻松地为您提供多线程测试覆盖率数据。

此工具可检测您的源代码;你编译并运行它。你最终(便宜) 表示各种块的代码中的检测探针。仪器仪表 记录程序的哪些部分执行,名义上是一个位向量 每个仪器探针位。在执行结束时(或者你喜欢的时候),这个 位向量被转出,观众将它显示给你叠加在代码上。

获得多线程测试覆盖率的技巧是知道我们为您提供完整的测试 控制定义仪器探头的工作方式;他们是宏。所以而不是 使用基本

的默认宏
  probe[n]=true;

在布尔数组上,您可以改为实现

  probe[n]|=1<<threadid;

在一个int数组上(或通过预先计算这个值巧妙地降低一些东西)。 这可能只需几行代码即可实现。

人们可能会注意到这在技术上存在同步问题。 这是真的,但最多会失去一点 覆盖率数据,并且它的可能性非常高。大多数人 对“非常好”的数据感到满意,而不是完美。如果你坚持 在完美时,你会用一些来支付高同步价格 原子更新指令。

我们还为您提供对探测转储逻辑的控制;你可以修改它来写出来 特定于线程的覆盖数据(在自定义代码范围的数十行中)。 然后,测试覆盖率数据查看器将允许您查看特定于线程的覆盖范围 (只需选择合适的覆盖率矢量);它还有内置的设施 轻松计算/显示交集/联合/差异 覆盖率向量,它可以准确地给出每线程覆盖率的关系。

答案 2 :(得分:0)

Concurrency Visualizer(可视化工作室的免费添加)是并行线程的非常好的可视化工具。包括可视化互斥锁,抢占和callstacks。 https://msdn.microsoft.com/en-us/library/dd537632.aspx