【问题标题】:Tools to visualize multithreaded C++ application call graph, multithreaded code coverage?可视化多线程 C++ 应用程序调用图、多线程代码覆盖率的工具?
【发布时间】:2011-12-06 15:20:54
【问题描述】:

我想知道有没有工具可以

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

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

【问题讨论】:

  • 祝你好运,我会寻找合理的答案。我认为您需要对要拆分为多的执行线程有一个完整的了解。有很多工具可以分析和生成执行图(最喜欢的是 Redgate 的性能分析器,价格昂贵但很棒),但如果没有具体细节,你就是在黑暗中拍摄。
  • @Justin 啊,我忘了说我正在开发的应用程序是用 C++ 编写的。
  • @fantasticid:我编辑了你的标题以反映你的兴趣。

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


【解决方案1】:

英特尔的VTune Profiler 可以满足您的要求。来自 VTune 网站:

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

    虽然我无法(但!)解决您的大多数问题,但我认为我们的 C++ Test Coverage 工具可以很容易地为您提供多线程测试覆盖率数据。

    此工具可检测您的源代码;你编译并运行它。你最终得到(便宜) 代表各种块的代码中的检测探针。仪器仪表 记录程序的哪些部分执行,名义上作为一个位向量 每个仪器探头位。在执行结束时(或任何时候),这 位向量被转储出来,查看器会将其叠加在代码上显示给您。

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

      probe[n]=true;
    

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

      probe[n]|=1<<threadid;
    

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

    人们可能会注意到这在技术上存在同步问题。 确实是这样,但顶多输一点 覆盖数据,并且反对它的几率非常高。大多数人 对“相当不错”的数据而不是完美的数据感到满意。如果你坚持 完美的话,你会付出高昂的同步代价 原子更新指令。

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

    【讨论】:

      【解决方案3】:

      Concurrency Visualizer(Visual Studio 的免费插件)是非常好的并行线程可视化工具。包括可视化互斥锁、抢占和调用堆栈。 https://msdn.microsoft.com/en-us/library/dd537632.aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多