Ftrace
转储很大。它转储每个进程的日志,而我只需要我的程序及其线程的信息。Ftrace
filter 只能对PID
s 起作用。但我需要进程名称(又名,comm
s)。所以这是我在不重新编译内核的情况下能做的最好的事情。
我使用Systemtap
了以下脚本:
sudo stap -e 'probe scheduler.process_exit {if (execname() == "evince"){printf("%s, %lu\n", execname(), task_current()->se->sum_exec_runtime)}}'
scheduler.process_exit()
Systemtap
是来自tapset库的一个探测点,它在内部挂钩do_exit()
内核函数(我使用前者,因为它看起来更便携)。execname()
返回进程名称并task_current()
返回当前上下文的任务。se
(调度程序的可调度实体)是(与Linuxtask_struct
中的进程或线程关联的数据结构)中的一个字段,显示可调度实体的总物理运行时间。sum_exec_runtime
所以,这就是脚本的作用:
在每个进程(或线程)退出时,它会检查进程(或线程)的名称是否为evince。如果是这种情况,将显示evince的总执行时间(以纳秒为单位)(因为我们在退出之前处于evince进程的上下文中)。
显然,这不是最便携的解决方案。