根据挂钟时间获取gprof配置文件?

时间:2010-05-10 15:29:27

标签: c++ profiling gprof

我的理解是默认情况下gprof会考虑CPU时间。有没有办法让它根据挂钟时间进行分析?

我的程序执行了大量的磁盘I / O,因此它使用的CPU时间仅占实际执行时间的一小部分。我需要知道磁盘的哪些部分i / O占用的时间最多。

4 个答案:

答案 0 :(得分:3)

您可以使用google-perftools中的profiler来衡量挂钟时间。要将Google Profiler切换为挂钟模式,请设置环境变量CPUPROFILE_REALTIME = 1.

答案 1 :(得分:1)

gprof 不会这样做。 看at this

And this.

简而言之:在 gdb 下,让它运行并随机执行Ctrl-Break或Ctrl-C 10次,并显示调用堆栈。如果您的I / O占用(例如)60%的时间,然后(大约)10个暂停中的6个,您将在writebuf或readbuf例程中看到它,并且请求I / O的代码行将清楚地显示在堆栈上。

您也可以使用 lsstack 来获取相同的信息。

答案 2 :(得分:1)

您可以使用strace或cachegrind正确分析代码。 strace将为您提供系统调用所花费时间的详细信息,而cachegrind将详细分析资源利用率。

答案 3 :(得分:0)

更改gprof以进行挂钟分析非常容易。要替换的唯一8个字符是:

ITIMER_PROF -> ITIMER_REAL

SIGPROF -> SIGALRM
文件glibc/sysdeps/posix/profil.c中的

,功能__profil,靠近setitimersigaction的调用(更确切地说是__Setitimer__sigaction)< / p>

更改后,任何使用SIGALRM的程序都将被破坏,任何没有阻塞系统调用重启代码的程序都会产生错误的结果。

此外,您可以直接更改glibc二进制文件中的int值(请不要在系统范围libc.so上执行此操作,单独复制并使用LD_LIBRARY_PATH将其提供给程序)

对于二进制补丁,ITIMER_PROF为2; ITIMER_REAL为0; SIGPROF是27(0x1b); SIGALRM是14(0x0e)。 glibc函数profil中的每个常量有两个位置。

另一种方法是编写一个ptrace-debugger,它将在运行时更改setitimer和sigaction函数的参数。