ftrace和tracepoint简单使用

ftrace

ftrace 的作用是帮助开发人员了解 Linux 内核的运行时行为,以便进行故障调试或性能分析。
最早 ftrace 是一个 function tracer,仅能够记录内核的函数调用流程。如今 ftrace 已经成为一个 framework,采用 plugin 的方式支持开发人员添加更多种类的 trace 功能。
Ftrace 由 RedHat 的 Steve Rostedt 负责维护。

1. 内核编译(打开ftrace)

CONFIG_KPROBES_ON_FTRACE=y
CONFIG_HAVE_KPROBES_ON_FTRACE=y
CONFIG_HAVE_DYNAMIC_FTRACE=y
CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y
CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y
CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
CONFIG_FTRACE=y
CONFIG_DYNAMIC_FTRACE=y
CONFIG_DYNAMIC_FTRACE_WITH_REGS=y
CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y
CONFIG_DYNAMIC_FTRACE_WITH_ARGS=y
CONFIG_FTRACE_SYSCALLS=y
CONFIG_FTRACE_MCOUNT_RECORD=y
CONFIG_FTRACE_MCOUNT_USE_CC=y
CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y
CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y

2. 挂载debugfs

mount -t debugfs debugfs /sys/kernel/debug/

3. 查看函数调用栈(以vfs_read()函数为例)

以下命令都是在:/sys/kernel/debug/tracing/目录下执行:

echo 1 > options/func_stack_trace
echo vfs_read > set_ftrace_filter
echo 1 > tracing_on
echo function > current_tracer
echo 0 > tracing_on
cat trace | head -n 20

结果如下:

/sys/kernel/debug/tracing # cat trace | head -n 20
# tracer: function
#
# entries-in-buffer/entries-written: 418/418   #P:1
#
#                                _-----=> irqs-off/BH-disabled
#                               / _----=> need-resched
#                              | / _---=> hardirq/softirq
#                              || / _--=> preempt-depth
#                              ||| / _-=> migrate-disable
#                              |||| /     delay
#           TASK-PID     CPU#  |||||  TIMESTAMP  FUNCTION
#              | |         |   |||||     |         |
              sh-78      [000] .....   332.939292: vfs_read <-ksys_read
              sh-78      [000] .....   332.940093: <stack trace>
 => 0xffffffffc0333083
 => vfs_read
 => ksys_read
 => do_syscall_64
 => entry_SYSCALL_64_after_hwframe
              sh-78      [000] .....   332.940622: vfs_read <-ksys_read

4. 查看函数子函数调用(以vfs_read()函数为例)

以下命令都是在:/sys/kernel/debug/tracing/目录下执行:

echo function_graph > current_tracer
echo vfs_read > set_graph_function
echo 5 > max_graph_depth
echo 1 > tracing_on
echo 0 > tracing_on
cat trace | head -n 50

结果如下:

/sys/kernel/debug/tracing # cat trace | head -n 40
# tracer: function_graph
#
# CPU  DURATION                  FUNCTION CALLS
# |     |   |                     |   |   |   |
 0) + 26.397 us   |  mutex_unlock();
 0)               |  vfs_read() {
 0)               |    rw_verify_area() {
 0)               |      security_file_permission() {
 0)               |        selinux_file_permission() {
 0)   2.639 us    |          __inode_security_revalidate();
 0)   1.278 us    |          avc_policy_seqno();
 0) + 11.926 us   |        }
 0) + 15.646 us   |      }
 0) + 19.372 us   |    }
 0)               |    new_sync_read() {
 0)               |      tty_read() {
 0)   1.007 us    |        tty_paranoia_check();
 0)               |        tty_ldisc_ref_wait() {
 0)   1.485 us    |          ldsem_down_read();
 0)   3.461 us    |        }
 0)               |        n_tty_read() {
 0)   1.854 us    |          mutex_lock_interruptible();
 0)   1.532 us    |          down_read();
 0)   3.663 us    |          add_wait_queue();
 0)   2.981 us    |          copy_from_read_buf();
 0)   5.688 us    |          n_tty_check_unthrottle();
 0)   1.014 us    |          n_tty_kick_worker();
 0)   1.039 us    |          up_read();
 0)   2.701 us    |          remove_wait_queue();
 0)   0.978 us    |          mutex_unlock();
 0) + 36.193 us   |        }
 0)               |        tty_ldisc_deref() {
 0)   1.004 us    |          ldsem_up_read();
 0)   2.937 us    |        }
 0)   0.978 us    |        ktime_get_real_seconds();
 0) + 56.611 us   |      }
 0) + 60.801 us   |    }
 0) + 93.459 us   |  }
 0)               |  vfs_read() {
 0)               |    rw_verify_area() {

tracepoint

tracepoint是预先在函数的插入点中插桩,当执行到函数的插入点,则执行插桩函数,进而触发与插入点预先绑定的probe函数,probe函数可以是一个或者多个,probe函数可以定义为任意的行为,从而可以起到对函数内部观测的作用。

1. 内核编译(打开tracepoint)

CONFIG_TRACEPOINTS=y
CONFIG_HAVE_SYSCALL_TRACEPOINTS=y

2. 挂载debugfs

mount -t debugfs debugfs /sys/kernel/debug/

3. 使用tracepoint(以系统调用mkdir为例)

以下命令都是在:/sys/kernel/debug/tracing/目录下执行:

echo 1 > events/syscalls/sys_enter_mkdir/enable
echo 1 > tracing_on
cd ~
mkdir haha
cd sys/kernel/debug/tracing/
cat trace

结果如下:

/sys/kernel/debug/tracing # cat trace
# tracer: nop
#
# entries-in-buffer/entries-written: 2/2   #P:1
#
#                                _-----=> irqs-off/BH-disabled
#                               / _----=> need-resched
#                              | / _---=> hardirq/softirq
#                              || / _--=> preempt-depth
#                              ||| / _-=> migrate-disable
#                              |||| /     delay
#           TASK-PID     CPU#  |||||  TIMESTAMP  FUNCTION
#              | |         |   |||||     |         |
           mkdir-84      [000] ...1.   697.463523: sys_mkdir(pathname: 7ffe07d21f4d, mode: 1ff)
           mkdir-85      [000] ...1.   707.071031: sys_mkdir(pathname: 7fff72d3af6c, mode: 1ff)
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
Linux中有两个常用的跟踪工具,分别是strace和ftrace。 strace是一个用户空间的跟踪工具,它可以追踪和记录应用程序的系统调用和信号。通过strace,我们可以了解应用程序在执行过程中与操作系统之间的交互,包括文件操作、网络通信、进程管理等。strace可以帮助开发人员调试和分析应用程序的问题,定位性能瓶颈和错误。 ftrace是Linux内核提供的跟踪工具,用于追踪内核中的函数调用和事件。它是内建于Linux内核中的,可以通过配置内核选项来启用和配置。ftrace提供了多个跟踪器,用于不同的场景,比如跟踪函数调用、上下文切换、中断关闭时长等。通过ftrace,我们可以深入了解内核的执行流程和性能瓶颈,帮助开发人员进行内核调试和性能优化。 总结来说,strace用于跟踪用户空间应用程序的系统调用和信号,而ftrace用于跟踪内核中的函数调用和事件。它们都是在Linux系统中进行高级性能分析和调试的重要工具。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* [Linux 追踪技术 ftrace 简介(一)](https://blog.csdn.net/weixin_45030965/article/details/125738911)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v4^insert_chatgpt"}} ] [.reference_item] - *3* [Linux:内核调试方法之strace ,ltrace, ptrace, ftrace, sysrq](https://blog.csdn.net/hhd1988/article/details/129562459)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v4^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值