使用 ftrace 调试 Linux 内核,第 1 部分

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CONFIG_FUNCTION_GRAPH_TRACER
CONFIG_CONG_NOP_TRACER
CONFIG_SCHED_TRACER
...ftrace相关的配置选项比较多,针对不同的跟踪器有各自对应的配置选项。不同的选项有不同的依赖关系,内核源码目录下的kernel/trace/Kconfig文件描述了这些依赖关系。读者可以参考Makefile文件和Konfig文件,然后选中自己所需要的跟踪器。通常在配置内核时,使用make menuconfig会更直观一些。以2.6.33.1版本的内核为例,要将ftrace编译进内核,可以选中Kernel hacking(图1)下的Tracers菜单项(图2)。图1. Kernel hacking图2. Tracers进入Tracers菜单下,可以看到内核支持的跟踪器列表。如图3所示,这里选中了所有的跟踪器,读者可以根据自己的需要选中特定的跟踪器。图3.内核支持的跟踪器列表这里要注意,如果是在32位x86机器上,编译时不要选中General setup菜单项(图4)下的Optimize for size选项(图5),否则就无法看到图3中的Kernel Function Graph Tracer选项。这是因为在Konfig文件中,针对32位x86机器,表项FUNCTION_GRAPH_TRACER有一个特殊的依赖条件:depends on !X86_32 || !CC_OPTIMIZE_FOR_SIZE图4. General setup图5. Optimize for sizeftrace通过debugfs向用户态提供了访问接口,所以还需要将debugfs编译进内核。激活对debugfs的支持,可以直接编辑内核配置文件.config,设置CONFIG_DEBUG_FS=y;或者在make menuconfig时到Kernel hacking菜单下选中对debugfs文件系统的支持,如图6所示。图6. debugfs编译选项配置完成后,编译安装新内核,然后启动到新内核。注意,激活ftrace支持后,编译内核时会使用编译器的-pg选项,这是在kernel/trace/Makefile文件中定义的,如清单2所示。清单2.激活编译选项-pg ifdef CONFIG_FUNCTION_TRACER
使用ftrace调试Linux内核,第1部分
ftrace是内建于Linux内核的跟踪工具,从2.6.27开始加入主流内核。使用ftrace可以调试或者分析内核中发生的事情。ftrace提供了不同的跟踪器,以用于不同的场合,比如跟踪内核函数调用、对上下文切换进行跟踪、查看中断被关闭的时长、跟踪内核态中的延迟以及性能问题等。系统开发人员可以使用ftrace对内核进行跟踪调试,以找到内核中出现的问题的根源,方便对其进行修复。另外,对内核感兴趣的读者还可以通过ftrace来观察内核中发生的活动,了解内核的工作机制。让内核支持ftrace使用ftrace,首先要将其编译进内核。内核源码目录下的kernel/trace/Makefile文件给出了ftrace相关的编译选项。清单1. ftrace相关的配置选项列表CONFIG_FUNCTION_TRACER
ORIG_CFLAGS := $(KBUILD_CFLAGS)
KBUILD_CFLAGS = $(subst -pg,,$(ORIG_CFLAGS))
...
endif
...使用-pg选项会在编译得到的内核映像中加入大量的调试信息。一般情况下,只是在开发测试阶段激活ftrace支持,以调试内核,修复bug。最终用于发行版的内核则会关闭-pg选项,也就无法使用ftrace。回页首通过debugfs访问ftraceftrace通过debugfs向用户态提供访问接口。配置内核时激活debugfs后会创建目录/sys/kernel/debug,debugfs文件系统就是挂载到该目录。要挂载该目录,需要将如下内容添加到/etc/fstab文件:debugfs /sys/kernel/debug debugfs defaults 0 0或者可以在运行时挂载:mount -t debugfs nodev /sys/kernel/debug激活内核对ftrace的支持后会在debugfs下创建一个tracing目录/sys/kernel/debug/tracing。该目录下包含了ftrace的控制和输出文件,如图7所示。根据编译内核时针对ftrace的设定不同,该目录下实际显示的文件和目录与这里也会不同。图7. tracing目录下的文件回页首ftrace的数据文件/sys/kernel/debug/trace目录下文件和目录比较多,有些是各种跟踪器共享使用的,有些是特定于某个跟踪器使用的。在操作这些数据文件时,通常使用echo命令来修改其值,也可以在程序中通过文件读写相关的函数来操作这些文件的值。下面只对部分文件进行描述,读者可以参考内核源码包中Documentation/trace目录下的文档以及kernel/trace下的源文件以了解其余文件的用途。README文件提供了一个简短的使用说明,展示了ftrace的操作命令序列。可以通过cat命令查看该文件以了解概要的操作流程。current_tracer用于设置或显示当前使用的跟踪器;使用echo将跟踪器名字写入该文件可以切换到不同的跟踪器。系统启动后,其缺省值为nop,即不做任何跟踪操作。在执行完一段跟踪任务后,可以通过向该文件写入nop来重置跟踪器。available_tracers记录了当前编译进内核的跟踪器的列表,可以通过cat查看其内容;其包含的跟踪器与图3中所激活的选项是对应的。写current_tracer文件时用到的跟踪器名字必须在该文件列出的跟踪器名字列表中。trace文件提供了查看获取到的跟踪信息的接口。可以通过cat等命令查看该文件以查看跟踪到的内核活动记录,也可以将其内容保存为记录文件以备后续查看。tracing_enabled用于控制current_tracer中的跟踪器是否可以跟踪内核函数的调用情况。写入0会关闭跟踪活动,写入1则激活跟踪功能;其缺省值为1。set_graph_function设置要清晰显示调用关系的函数,显示的信息结构类似于C语言代码,这样在分析内核运作流程时会更加直观一些。在使用function_graph跟踪器时使用;缺省为对所有函数都生成调用关系序列,可以通过写该文件来指定需要特别关注的函数。buffer_size_kb用于设置单个CPU所使用的跟踪缓存的大小。跟踪器会将跟踪到的信息写入缓存,每个CPU的跟踪缓存是一样大的。跟踪缓存实现为环形缓冲区的形式,如果跟踪到的信息太多,则旧的信息会被新的跟踪信息覆盖掉。注意,要更改该文件的值需要先将current_tracer设置为nop才可以。tracing_on用于控制跟踪的暂停。有时候在观察到某些事件时想暂时关闭跟踪,可以将0写入该文件以停止跟踪,这样跟踪缓冲区中比较新的部分是与所关注的事件相关的;写入1可以继续跟踪。available_filter_functions记录了当前可以跟踪的内核函数。对于不在该文件中列出的函数,无法跟踪其活动。set_ftrace_filter和set_ftrace_notrace在编译内核时配置了动态ftrace(选中CONFIG_DYNAMIC_FTRACE选项)后使用。前者用于显示指定要跟踪的函数,后者则作用相反,用于指定不跟踪的函数。如果一个函数名同时出现在这两个文件中,则这个函数的执行状况不会被跟踪。这些文件还支持简单形式的含有通配符的表达式,这样可以用一个表达式一次指定多个目标函数;具体使用在后续文章中会有描述。注意,要写入这两个文件的函数名必须可以在文件available_filter_functions中看到。缺省为可以跟踪所有内核函数,文件set_ftrace_notrace的值则为空。回页首ftrace跟踪器ftrace当前包含多个跟踪器,用于跟踪不同类型的信息,比如进程调度、中断关闭等。可以查看文件available_tracers获取内核当前支持的跟踪器列表。在编译内核时,也可以看到内核支持的跟踪器对应的选项,如之前图3所示。nop跟踪器不会跟踪任何内核活动,将nop写入current_tracer文件可以删除之前所使用的跟踪器,并清空之前收集到的跟踪信息,即刷新trace文件。function跟踪器可以跟踪内核函数的执行情况;可以通过文件set_ftrace_filter显示指定要跟踪的函数。function_graph跟踪器可以显示类似C源码的函数调用关系图,这样查看起来比较直观一些;可以通过文件set_grapch_function显示指定要生成调用流程图的函数。sched_switch跟踪器可以对内核中的进程调度活动进行跟踪。irqsoff跟踪器和pre
相关文档
最新文档