我的理解是默认情况下gprof会考虑CPU时间。有没有办法让它根据挂钟时间进行分析?
我的程序执行了大量的磁盘I / O,因此它使用的CPU时间仅占实际执行时间的一小部分。我需要知道磁盘的哪些部分i / O占用的时间最多。
答案 0 :(得分:3)
您可以使用google-perftools中的profiler来衡量挂钟时间。要将Google Profiler切换为挂钟模式,请设置环境变量CPUPROFILE_REALTIME = 1.
答案 1 :(得分:1)
gprof 不会这样做。 看at 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
,靠近setitimer
和sigaction
的调用(更确切地说是__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函数的参数。