2010-06-02 64 views
5

我有一个程序,我想用gprof进行配置文件。问题(表面上)是它使用套接字。所以我得到的东西是这样的:使用gprof与套接字

::select(): Interrupted system call 

我打这个问题而回,放弃了,并继续前行。但我真的很想能够剖析我的代码,如果可能,请使用gprof。我能做什么?有没有我错过的gprof选项?套接字选项?在这些类型的系统调用中gprof是完全无用的吗?如果是这样,是否有一个可行的选择?

编辑:平台:

  • 的Linux 2.6(x64)的
  • GCC 4.4.1
  • gprof的2.19
+0

我想你也应该提到你的平台:操作系统,编译器,gprof的版本等 – 2010-06-02 12:52:27

+2

我发现这篇文章:也许这是一些使用的: http://unix.derkeiler.com/Newsgroups/comp.unix .programmer/2004-03/0938.html – LoudNPossiblyWrong 2010-06-02 12:57:12

+0

您是否尝试过使用valgrind/kcachegrind来配置文件?我更喜欢它gprof。 – 2010-06-02 12:57:24

回答

5

插座代码需要处理中断系统调用不管profiler如何,但在profiler下是不可避免的。这意味着有类似的代码。

if (errno == EINTR) { ... 

每次系统调用后。

看一看,例如,here为背景。

+0

太好了,谢谢。后续:http://stackoverflow.com/questions/2958114/handling-eintr-with-goto – 2010-06-02 13:28:32

1

gprofhere's the paper)是可靠的,但它only was ever intended to measure changes,甚至为此,它只测量CPU绑定的问题。它从来没有被宣传为有用的定位问题。这是其他人在其上分层的想法。

考虑this method

另一个不错的选择,如果你不介意花一些钱,是Zoom

加:如果我可以给你举个例子。假设你有一个调用层次结构,其中Main调用了一些次数,A调用了一定次数的B,B调用了C次数,而C用一个套接字或文件等待了一些I/O,而这基本上都是该计划的确如此。现在,进一步假设每个例程调用下一个例程的次数比实际需要的次数多25%。由于1.25^3约为2,这意味着整个程序需要两倍的时间才能运行。

首先,因为所有的时间都花在等待I/O上,所以gprof将不会告诉你这段时间是如何度过的,因为它只看“运行”时间。

二,假设(仅供参数)确实计算I/O时间。它可以给你一个通话图,基本上说每个程序都占用了100%的时间。这是什么告诉你的?没有比你已经知道的更多。

但是,如果你采取少量的堆栈样本,你会看到每一个例程调用下一个代码的行。 换句话说,它不只是给你一个大概的百分比时间估计,它是指向你昂贵的代码特定的代码行。 你可以看看每一行代码,并询问是否有办法做到这一点更少。假设你这样做,你会得到2加速因子。

人们通过这种方式获得了很大的因素。根据我的经验,通话等级的数量可以轻松达到30或更多。每个电话似乎必要的,直到你问是否可以避免。即使是少量的可避免的呼叫,也可以在很多层上产生巨大的影响。