dynamic_debugfs使用

23 篇文章 0 订阅
8 篇文章 0 订阅

内核开启模块:
CONFIG_DYNAMIC_DEBUG

文件系统挂载:
mount -t debugfs none /sys/kernel/debug/

查看log的过滤格式:
在语法层面上,一个命令由一系列的规格匹配组成,随后由一个标记来改变这规格。

command ::= match-spec* flags-spec

match-spec常用来选择一个已知的dprintk()调用点的子集来套用flags-spec。把他们当做彼此之间的每对做隐式查询。注意一个空的match_specs列表是有可能的,但不是非常有用,因为它不会匹配任何调用点的调试子句。

一个匹配规范由一个关键字组成,关键字控制被比较的调用点的属性和要比较的值。可能关键字是:

match-spec ::= ‘func’ string |
‘file’ string |
‘module’ string |
‘format’ string |
‘line’ line-range

line-range ::= lineno |
‘-‘lineno |
lineno’-’ |
lineno’-'lineno
// 注意:line-range不能包含空格,例如
// “1-30”是有效的范围,但“1 - 30”就是无效的

lineno ::= unsigned-int

每个关键字的意思是:

func
给定的字符穿会和每个调用点的函数名比较。例如:

func svc_tcp_accept

file
给定的字符串会和每个调用点的源文件的全路径名或者相对名比较。例如:

file svcsock.c
file /usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svcsock.c

module
给定的字符串会和每个调用点的模块名进行比较。模块名是和在“lsmod”里看到的字符串一样,举例来说,没有路径或者是.ko后缀同时带有’-‘的改变为’_’。

module sunrpc
module nfsd

format
给定的字符串会在动态调试格式字符串里查找。注意这字符串不需要匹配这个格式,这是一部分。空格和其他特殊字符能够用C的八进制字符语法来转义,例如空字符是\040。作为选择,这个字符串可以附上双引号(")或者是单引号(‘)。
例如:

format svcrdma:        // 大多数NFS/RDMA 服务器的dprintks
format readahead        // 一些在预加载缓存里的dprintks
format nfsd:\040SETATTR // 一个使用空格来匹配格式的方式
format "nfsd: SETATTR"  // 一个整齐的方法来用空格匹配格式
format 'nfsd: SETATTR'  // 同样是一个用空格来匹配格式的方法和

line
给定的行号或者是行号范围会和每个dprintk()调用点
的行号进行比较。一个单一的行号与调用点 的行号 进行准
确匹配。一个行号范围会和包含的第一行和最后一行 的任何调
用点进行匹配。一个空的第一个数字表示该文件的第 一行
,一个空的行号表示文件的最后一行。例如:

line 1603        // 准确定位到1603行 
line 1600-1605  //1600行到1605行之间的6行
line -1605        // 从第一行到1605行之间的1605行
line 1600-        // 从1600行到结尾的全部行

标记规范包含了一个由一个或多个标记字符跟随的变化操作。这变化操作是下面的字符之一:

-
移除给定的标记

+
加入给定的标记

=
设置标记到给定的标记上

这些标记是:

f
包含已打印消息的函数名
l
包含已在打印消息的行号
m
包含已打印消息的模块名
p
产生一个printk()消息到显示系统启动日志
t
包含了不在中断上下文中产生的消息里的线程ID

注意正则表达式^[-+=][flmpt]+$匹配一个标记规范。
同样也要注意,没有便捷的语法来一次性移除所有的标记,你需要使用"-flmpt"。

引导进程中的调试信息

即使在用户空间和debugfs存在之前,也可以使用引导参数:ddebug_query=“QUERY”来激活引导进程中的调试信息。

QUERY遵循上述语法,但一定不能超过1023个字符。调试信息的启动随着arch_initcall而完成。因此通过引导参数arch_initcall之后,你可以在所有的代码处理中启用调试信息。

例如,在一个x86的系统中,ACPI启用是一个subsys_initcall并且如果你的机器(通常是一台笔记本)有一个嵌入式的控制器,ddebug_query=“fileec.c+p”将会在ACPI装备期间显示早期的嵌入式控制器事务。PCI(或其他设备)的初始化也是使用这个引导参数来调试的热门候选。

实例

// 提供文件 svcsock.c 1603行信息
nullarbor:~ # echo -n ‘file svcsock.c line 1603 +p’ >
<debugfs>/dynamic_debug/control

// 提供文件svcsock.c所有信息
nullarbor:~ # echo -n ‘file svcsock.c +p’ >
<debugfs>/dynamic_debug/control

// 提供NFS服务模块所有的信息
nullarbor:~ # echo -n ‘module nfsd +p’ >
<debugfs>/dynamic_debug/control

// 提供函数svc_process()的所有12条信息
nullarbor:~ # echo -n ‘func svc_process +p’ >
<debugfs>/dynamic_debug/control

// 不显示 函数svc_process()的所有12条信息
nullarbor:~ # echo -n ‘func svc_process -p’ >
<debugfs>/dynamic_debug/control

// 提供NFS调用的所有以READ开始的信息.
nullarbor:~ # echo -n ‘format “nfsd: READ” +p’ >
<debugfs>/dynamic_debug/control

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值