如何在Linux上分析我的C ++应用程序

时间:2010-05-12 20:00:35

标签: c++ linux profiler

我想在linux上分析我的c ++应用程序。 我想知道我的应用程序在CPU处理上花费了多少时间与IO /空闲时在块上花费的时间。

我知道在linux上有一个配置文件工具调用valgrind。但它打破了在每种方法上花费的时间,并没有让我全面了解CPU处理与闲置相比花费了多少时间?或者有没有办法用valgrind做到这一点。

9 个答案:

答案 0 :(得分:6)

结帐oprofile。另外,对于更多系统级诊断,请尝试systemtap

答案 1 :(得分:3)

我可以将valgrind的{​​{3}}工具与callgrind一起推荐用于可视化。 KCacheGrind可以很容易地看到热点的位置。

注意:自从我使用它以来已经太久了,所以我不确定你是否能够获得I / O等待时间。也许与KCacheGrindiostat一起,您将能够看到所有时间花在哪里。

答案 2 :(得分:3)

您可能需要查看Zoom,这比oprofile et al 更精致,功能更全面。这需要花钱(199美元),但你可以获得30天的免费评估许可证。

答案 3 :(得分:2)

LTTng是用于完整系统分析的好工具。

答案 4 :(得分:2)

如果你的应用程序只是运行“扁平化”(即它使用CPU或等待I / O),直到它退出,并且没有其他进程竞争,只需执行time myapp(或者{{} { 1}},它对内置的shell产生略微不同的输出。)

这会得到类似的东西:

/usr/bin/time myapp

在这种情况下,用户+ sys(内核)时间占了几乎所有的实时时间,并且只有0.068秒未计入...(可能是最初加载应用程序及其支持库所花费的时间)。

但是,如果你要看到:

real    0m1.412s
user    0m1.288s
sys     0m0.056s

然后你的应用程序花了4.51s不消耗CPU并且可能在IO上被阻止。这是我认为您正在寻找的信息。

然而,这种简单的分析技术崩溃的地方是:

  • 等待定时器/时钟或等待的应用程序 其他外部刺激(例如 事件驱动的GUI应用程序)。它不能 区分等待时钟的时间 和等待磁盘/网络的时间。
  • 多线程应用程序,需要更多考虑解释数字。

答案 5 :(得分:1)

callgrind是一个非常好的工具,但我发现OProfile对我来说更“完整”。此外,它是唯一允许您指定模块和/或内核源的工具,以便更深入地了解您的瓶颈。输出应该能够与KCacheGrind接口,但我遇到了麻烦,所以我使用Gprof2Dot代替。您可以将调用图导出为.png。

编辑:

OProfile查看整个系统,因此过程将只是:

[设置oprofile]

opcontrol --init
opcontorl --vmlinux=/path/to/vmlinux     (or --no-vmlinux)
opcontrol --start

[在这里运行您的应用]

opcontrol --stop   (or opcontrol --shutdown [man for difference]

然后开始查看结果,看看opreport上的手册页

答案 6 :(得分:0)

valgrind中的lackey和/或helgrind工具应该允许你这样做。

答案 7 :(得分:0)

google-perf-tools - 更快的替代callgrind(它可以生成与callgrind格式相同的输出,因此您可以使用KCacheGrind)。

答案 8 :(得分:-1)

See this post.

And this post.

基本上,在程序启动和完成之间,它有一个调用堆栈。在I / O期间,堆栈在系统调用中终止。在计算过程中,它以典型指令终止。

无论哪种方式,如果您可以在随机的挂钟时间对堆栈进行采样,您可以确切地看到为什么花费这段时间。

唯一剩下的一点是 - 数以千计的样本可能会给人一种自信,但他们不会告诉你超过10或20个样本。