使用动态输出打印内核的DEBUG信息

printk()是很多嵌入式开发者喜欢用的调试手段之一,但是,使用printk()每次都要重新编译内核,很不方便。使用动态输出在不需要重新编译内核的情况下,方便的打印出内核的debug信息。,要开启动态输出,内核需要添加CONFIG_DYNAMIC_DEBUG​。开启宏之后,pr_debug(),​dev_dbg() ,​print_hex_dump_debug(),print_hex_dump_bytes()`所有信息都可以被动态打印出来。,动态输出在debugfs文件系统中对应的是control文件节点。control文件节点记录了系统中所有使用动态输出技术的文件名路径,输出语句所在的行号、模块名和将要输出的语句等。,你可以通过以下命令查看目前所有调试状态的行为配置:,你也可以应用标准的Unix文本过滤命令来过滤这些数据, 例如:,在第三列显示了调试状态位的激活标志。如果无额外行为被激话, 为 “=_”。因此你可以通过下面的命令查看任何不是默认标志的状态位:,在语法层面上,一个命令由一系列的规格匹配组成,最后由一个标记来改变这规格。,match-spec常用来选择一个已知的dprintk()调用点的子集来套用flags-spec。把他们当做彼此之间的每对做隐式查询。注意,一个空的match_specs列表是有可能的,但不是非常有用,因为它不会匹配任何调用点的调试子句。,一个匹配规范由一个关键字组成,关键字控制被比较的调用点的属性和要比较的值。可能关键字是:,注意:line-range不能包含空格,例如,“1-30”是有效的范围,但“1 – 30”就是无效的,每个关键字的含义如下:,标记规范包含了一个由一个或多个标记字符跟随的变化操作。这变化操作如下所示:,在调试系统启动是时,像USB核心初始化等,这些代码在系统进入shell前已经初始化完毕,因此无法及时打开动态输出语句。这时可以在内核启动时传递参数给内核,在系统初始化时就打开它们。,例如,在内核命令行中添加 usbnet.dyndbg=+plft ,就可以在启动时打开 usbnet的动态输出。,在内核启动后,通过 dmesg | grep “usbnet” 即可看到输出的调试信息。,打开文件svcsock.c 1603行动态输出语句,打开文件svcsock.c所有动态输出语句,打开NFS服务模块所有动态输出语句,打开函数svc_process()的所有动态输出语句,关闭函数svc_process()的所有动态输出语句,打开NFS调用的所有以READ开始的信息.,查看输出的信息可以使用 dmesg | grep XXX​ 。也可以使用 tail -f /var/log/dmesg来实时监控dmesg的日志输出。,dynamic-debug-howto.txt,《奔跑吧Linux内核》

文章版权声明

 1 原创文章作者:cmcc,如若转载,请注明出处: https://www.52hwl.com/17173.html

 2 温馨提示:软件侵权请联系469472785#qq.com(三天内删除相关链接)资源失效请留言反馈

 3 下载提示:如遇蓝奏云无法访问,请修改lanzous(把s修改成x)

 免责声明:本站为个人博客,所有软件信息均来自网络 修改版软件,加群广告提示为修改者自留,非本站信息,注意鉴别

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023年3月5日 上午12:00
下一篇 2023年3月7日 下午10:34