在Mac OS X上分析C ++


69

我正在尝试在Mac(OS X Lion)上配置一些c ++代码,但找不到任何有用的东西。我正在寻找一个探查器,该探查器将告诉我哪些功能占用了我的CPU时间(类似于matlab探查器)。

这是我尝试过的

  • gprof。这是我在linux机器上使用的,但是它只是在Mac上给了我空的输出(显然是一个已知问题)
  • 仪器。我一生都无法弄清楚如何在已编译的二进制文件中分析任何内容。我也找不到任何有用的教程。
  • (其他搜索显示Shark(不再可用)和Valgrind(用于存储))。

非常感谢您的帮助!


你可以试试这个,对于这些原因
Mike Dunlavey,2012年

MikeDunlavey的评论倾斜地建议您在gdb(或其他调试器,如果您能弄清楚如何)中打开程序,并定期手动中断它,基本上模拟了gprof / Instruments对您会做什么,但会增加精神压力。只需使用Instruments即可;有关逐步说明,请参见下面的@duskwuff答案。
Quuxplusone

@Quuxplusone:我的倾斜建议是gprof / Instruments找不到的加速机会。仪器对调用堆栈进行采样,但是据我所知,它实际上并不能让您实际检查单个堆栈采样,这是您发现加速的方法。而是(除非我弄错了)它接受了“热路径”的概念,并且在任何体面大小的非玩具程序中,大问题都可以轻易地从热路径中隐藏。
Mike Dunlavey 2014年

@Quuxplusone:以下是构建热路径的方法。采集所有通过样品的样品(100%)。在这些样本中,从main处找到最常用的例程(称为A),并假设它位于30%的样本上。其它功能可以在另外的70%,但每叫不到一个。在这些样本中,找到最常被A调用的例程(称为B),并假设它在这些样本的30%上。好的,因此序列main-AB占样本的30%乘以30%= 9%。超过9%的任何东西都不会被注意到。您可以说,经过几个级别之后,您看不到很多东西。
Mike Dunlavey 2014年

BSD的iprofiler很不错,因为它的输出可以在Instruments中打开。
Entalpi '18年

Answers:


113

仪器是使用的工具。关于Instruments的完整说明不在此答案的范围内,但是这里有一个快速入门指南:

  1. 打开乐器。1个
  2. 选择“时间分析器”模板。
  3. 在“目标”下拉菜单中选择您的应用程序。2
  4. 点击红色圆圈(“记录”)按钮,开始运行您的应用程序。
  5. 如果适用,请在您的应用程序中进行一些需要分析的工作。
  6. 再次点击录制按钮以停止录制。
  7. 使用仪器中的工具分析结果。

在可用的工具中,最常用的工具是:

  • 使用公开箭头扩展呼叫树
  • 单击功能名称上带圆圈的箭头以使其聚焦
  • 双击一个函数以查看关联的源
  • 左侧的“反转呼叫树”复选框

您也可以instruments在命令行上启动的调用:

instruments -l 30000 -t Time\ Profiler -p 5773

参见说明


1打开乐器的一种简单方法是使用Spotlight:只需单击任务栏右上角的放大镜(位于时钟旁边),然后键入“乐器”。

2单击“选择目标...”,然后导航到可执行文件的路径。


@duskwuff,您好,这就是我一直在做的事情,但是我的Stack-Trace是空的。那里绝对没有。我的应用程序是一个命令行工具,应在30秒后终止,但是Instruments仍在继续。另外,我似乎也找不到任何命令行输出(不是必须的,但这很好地表明我的程序正在运行)
雾化了

嗯……您也可以尝试将目标设置为“所有进程”,然后在仪器运行时在终端中手动启动程序。它可以让您从程序采样的其他所有内容中提取程序的数据。只需在结果中单击工具名称上的箭头即可。
duskwuff -inactive-

3
仅供参考,我刚刚了解了iprofilerCLI工具来收集可使用Instruments应用查看的跟踪。由于man -k profiler不将其包含在结果中,因此发现它并不容易。
Kurtis Rader

2
也可以在命令行中使用instruments。例如,instruments -t "Time Profiler" ./a.out foo.txt 20—比在GUI中设置参数和工作目录容易。此后,instrumentscli0.trace可以通过Instruments GUI打开结果,或者甚至可以通过命令行打开(在GUI中打开)结果:open -a Instruments instrumentscli0.trace
ShreevatsaR

8

仪器是使用的工具。要克服空白跟踪的问题,请确保从XCode中打开Instruments:

Xcode > Open Developer Tool > Instruments

如果您在上次更新XCode之前从固定在扩展坞上的旧“工具”图标打开“工具”,它将显示空白痕迹。


1
确实。那为我解决了空白的调用树问题。谢谢!
bsumirak

1
这似乎是现在启动Instruments的唯一方法(当然不是命令行)。在最近的OS升级之后,它不再受到关注。不知道什么时候改变了。
Bryn Keller

8

仪器确实是正确的答案,但是如果您不知道如何使用它,那么另一个选项是内置“活动监视器”应用程序中的探查器。在活动监视器中,您可以获得有关任何正在运行的进程的信息,并且有一个按钮可以在一段时间内对其执行进行采样。您将必须启动程序,切换到“活动监视器”,找到该过程,然后对其进行采样。

此外,您只需在调试器中运行该程序并手动将其暂停六十次左右,然后注意调用堆栈,即可进行“穷人分析”。它非常简单,但是对于相当一部分程序来说,它作为初次使用时效果令人惊讶。

还有一个命令行sample程序像其他程序一样对调用堆栈进行采样。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.