繁体   English   中英

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

[英]Get gprof to profile based on wall-clock time?

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

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

您可以使用 google-perftools 中的分析器来测量挂钟时间。 要将 google profiler 切换到挂钟模式,请设置环境变量 CPUPROFILE_REALTIME=1。

gprof不会这样做。 看看这个

和这个。

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

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

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

您可以使用带有 gcc 编译器的-finstrument-functions选项来执行此操作。 这将获得在任何函数的入口/出口点调用的自定义函数,只需要提供几个函数回调( __cyg_profile_func_enter__cyg_profile_func_exit )。

您可以通过查找 gcc 手册中的-finstrument-functions选项找到更多详细信息。

Balau 的技术博客上也有一篇很好的文章,提供了端到端的概述/工作原理示例: 使用 GCC 跟踪和分析函数调用

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

ITIMER_PROF -> ITIMER_REAL

SIGPROF -> SIGALRM

在文件glibc/sysdeps/posix/profil.c ,函数__profil ,靠近对setitimersigaction的调用(更准确的__Setitimer__sigaction

更改后,任何使用 SIGALRM 的程序都将被破坏,任何没有阻塞系统调用重新启动代码的程序都可能给出错误的结果。

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

对于二进制补丁,ITIMER_PROF 为 2; ITIMER_REAL 为 0; SIGPROF 为 27 (0x1b); SIGALRM 是 14 (0x0e)。 有两个地方,在每个功能不断profil的glibc。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM