使用dynamic debug帮助调试

你一定在kernel source code中看过很多pr_debug()/dev_dbg()/print_hex_dump_debug()吧,这些debug语句提供更多的信息帮助我们了解内核运行流程或是定位问题,可以在运行时按per-callsite单独开启/关闭。那我们来看一下它是如何实现和使用的吧。

一、kernel configuration

在编译时,需要设置

CONFIG_DYNAMIC_DEBUG=y

CONFIG_DEBUG_FS=y

打开这个配置之后,kernel会提供一个debugfs control file:/sys/kernel/debug/dynamic_debug/control

通过这个文件,可以在运行时打开/关闭dynamic debugging statement。

debugging statement可以通过filename/module/function/line number来匹配。

往dynamic_debug debugfs中写入的内容主要是operations+flags;

其中operation有以下三种:

   +:add the given flags;

   -: remove the given flags;

   =:set the dyndbg flags to the given flags;

其中flags包括:

   p:enable the pr_debug() callsite;

   f/l/m/t:include the function name、line number、module name、threadID in the printed message;

比如,想要打开svcsock.c文件中,line 1603中的pr_debug,可以设置

# echo "file svcsock.c line 1603 +p" > /sys/kernel/debug/dynamic_debug/control;

二、开启dynamic debug的四种方式

2.1 在内核编译时

修改你关心模块目录下的Makefile文件,对指定文件/模块打开dynamic debug

ccflags-y += -DDEBUG

比如我们想要打开arch/x86/kernel/smpboot.c中的pr_debug

vim arch/x86/kernel/Makefile

在 obj-$(CONFIG_SMP)               += smpboot.o

后面,添加 

 CFLAGS_smpboot.o += -DDEBUG 或   ccflags-$(CONFIG_SMP) += -DDEBUG 

之后,重新编译kernel,即可开启smpboot.c文件中的dynamic debug。

2.2 boot time 系统启动时开启

对于core code和built-in modules中的debug message,可以在系统启动时开启,在启动参数中设置

“module.dyndbg="QUERY"”,

其中module就是lsmod命令显示的结果(去除路径信息,把'-'改成'_')

这些dyndbg参数会在ddebug tables处理之后来处理,是archi_initcall的一部分。

比如,在x86系统中,开启ec.c中的dynamic debug,可以在commandline中设置 dyndbg="file ec.c +p"

如果module foo不是built-in的,foo.dyndbg依然会在boot time时处理,在module foo加载时再次处理。

2.3 加载module时设置dyndbg

modprobe foo执行时,会扫描/proc/cmdline中的foo.params,并跟其他在modprobe时指定的module params、/etc/modprob.d/*.conf中的参数一起传递给kernel来处理;所有的参数按照以下顺序来处理

a) /etc/modprobe.d/*.conf中的module params

options foo dyndbg=+pt

options foo dyndbg               //default,使用+p

b) boot commandline中设置的params

 foo.dyndbg = "func bar +p; func buz +mp"

c) 在modprobe加载时指定的参数

modprobe foo dyndbg==pmf      //这会override之前的配置

2.4 在系统运行时,通过debugfs修改

在编译或系统启动时,开启的dynamic_debug选项都可以通过/sys/kernel/debug/dynaminc_debug/control来查询并修改

cat /sys/kernel/debug/dynaminc_debug/control

查询所有开启了dynamic debug选项的文件;

开启某个文件中的pr_debug或dev_dbg

echo 'file $file_name +p' > /sys/kernel/debug/dynaminc_debug/control

比如开启smpboot.c中的pr_debug信息

echo 'file smpboot.c  +p' > /sys/kernel/debug/dynaminc_debug/control

之后,查看相关的dynamic debug是否开启

cat /sys/kernel/debug/dynaminc_debug/control | grep smpboot

arch/x86/kernel/smpboot.c:1356 [smpboot]native_smp_cpus_done =p "Boot done\012"
arch/x86/kernel/smpboot.c:1095 [smpboot]native_cpu_up =p "do_boot_cpu %d Already started\012"
arch/x86/kernel/smpboot.c:1082 [smpboot]native_cpu_up =p "++++++++++++++++++++=_---CPU UP  %u\012"
arch/x86/kernel/smpboot.c:993 [smpboot]do_boot_cpu =p "Setting warm reset code and vector.\012"
……
停止某个文件中的dynamic debug打印

echo 'file $file_name -p' > /sys/kernel/debug/dynaminc_debug/control

打印某个module中的信息

​​​​​​​echo 'module $mod_name +p' > /sys/kernel/debug/dynaminc_debug/control

 

参考文件Documentation/admin-guide/Dynamic-debug-howto.rst

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值