5

我想知道有没有工具可以

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

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

4

3 回答 3

1

Intel的VTune Profiler 可以满足您的要求。从 VTune 网站:

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

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

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

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

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

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

于 2011-10-13T04:18:14.013 回答
1

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

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

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

  probe[n]=true;

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

  probe[n]|=1<<threadid;

在一个 int 数组上(或者通过预先计算这个值而更便宜的东西)。这可能只需要几行代码即可实现。

人们可能会注意到这在技术上存在同步问题。这是真的,但最多它会丢失一些覆盖数据,而且它的几率非常高。大多数人对“相当不错”的数据感到满意,而不是完美。如果您坚持完美,您将使用一些原子更新指令付出高昂的同步代价。

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

于 2011-10-13T04:55:16.107 回答
0

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

于 2017-04-19T20:33:36.953 回答