使用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。
通过这个文件,可以在运行时打开/关闭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
使用dynamic debug帮助调试的更多相关文章
- linux dynamic debug 官方教程
下载内核后,文档在:Documentation/dynamic-debug-howto.txt 中文版本:http://www.oschina.net/translate/dynamic-debug- ...
- debug断点调试
debug断点调试 1,虫子启动2,F6 执行断点的下一步,下一个语句 F5 进入方法 F8 执行到结束 查看表达式的值:选中查看的表达式,接着按 ctrl ...
- Eclipse开发环境debug模式调试断点从jar跳到源码
Eclipse开发环境debug模式调试断点从jar跳到源码 说明:本案例使用jsch-0.1.54.jar和源码做test,项目分成两个,一个是jsch的源码,另一个是测试案例 一.下载JSch.的 ...
- Android调试大法 自定义IDE默认签名文件==>微信支付、微信登录、微信分享,debug时调试通过,release时调不起微信
转载地址:http://blog.yanzhenjie.com Android调试大法之自定义IDE默认签名文件,你是否为调试第三方SDK时debug签名和release签名发生冲突而烦恼?你是否在d ...
- IIS调试技术之 Debug Diagnostic (调试诊断)
IIS 调试技术之 Debug Diagnostic (调试诊断) 1 概述 1.1 文档简介 系统出现错误或崩溃,免不了要进行调试.调试能进行的前提是错误能重现,但实际上要重现一个错误有 ...
- 设置Eclipse可以Debug模式调试JDK源码,并显示局部变量的值
最近突然萌发了研究JDK源码的想法,所以就想到了在自己常用的Eclipse上可以调试JDK源码. 整个设置过程也很简单: 首先你要安装好JDK(我的JDK安装路径根目录是D:\Java\jdk-8u9 ...
- (转)Intellij IDEA 2017 debug断点调试技巧与总结详解篇
背景:详细介绍idea的debug调试过程 Intellij IDEA 2017 debug断点调试技巧与总结详解篇
- 高通平台打开 dynamic debug方法【学习笔记】
一.首先在内核的配置文件添加如下的配置: CONFIG_DEBUG_FS=y CONFIG_DYNAMIC_DEBUG=y 二.找到自己平台对应的 device/qcom/xxxx/init.targ ...
- Debug代码调试
Debug代码调试 第一步在代码左侧先点一个红点 第二步右键选择Debug运行 第三步点击Step Into按键分步进行 练习题: s2 = 'python python python python ...
- Dynamic CRM插件调试与单元测试
背景 使用Dynamic CRM平台开发完业务插件后,不可避免的就是进行插件调试,测试插件是否正常运行,网上关于Dynamic CRM的资料比较少,但对于调试的博客还是挺多的,足可见插件调试对于Dyn ...
随机推荐
- (2024最新)有效解决OpenAI Chatgpt Plus升级报错【您的银行卡被拒绝了/your card has been declined」,不用再问怎么办?
在OpenAI升级ChatGPT plus时我们可能会遇到升级报错[您的银行卡被拒绝了/your card has been declined」,有些人看到这个可能就会不知所措 注意,这个问题目前依旧 ...
- 我的编程经历,从天桥地摊Basic到西藏阿里的.Net AOT。(一,从井到Sharp)
撇清一层歧义:标题中的阿里不是指阿里巴巴集团,喜马拉雅也不是指那个做音频频道的公司,文中所及内容以及我本人都与他们没有任何关联.依照地理正式名称:阿里指的是西藏西部阿里地区,喜马拉雅指的是青藏高原地球 ...
- Jmeter函数助手1-CSVRead
CSVRead函数适用于读取文件获取参数值. 用于获取值的CSV文件 | *别名:csv文件路径 CSV文件列号| next| *alias:读取列,0表示第一列,1表示第二列 1.首先我们需要一个文 ...
- 单细胞转录组上游fasta文件处理
单细胞分析上游fasta文件处理 --基于cellranger与dropseqRunner ###如果测序文件由10X genomics平台产生,则采用cellranger count的基本流程进行f ...
- 【Uni-App】API笔记 P2
8.路由,跳转 一.保留当前页面并跳转到指定页面 使用uni.navigateBack可以返回到原页面. uni.navigateTo(OBJECT) OBJECT参数说明 参数 类型 必填 默认值 ...
- 【Docker】06 部署挂载本地目录的Nginx
1.拉取Nginx镜像: docker pull nginx:1.19 2.生成一个测试的Nginx容器: docker run --rm --name nginx-test -p 8080:80 - ...
- 一个专为量化投资开发的强化学习算法框架:ElegantRL
链接: https://github.com/AI4Finance-Foundation/ElegantRL 这是一个专为量化投资开发的强化学习算法框架. 相关论文: ElegantRL-Podrac ...
- 键盘中上、下、左、右四个光标键所对应的ASCII码值为多少
首先给出ASCII码值表: 上.下.左.右这四个光标键对应的ASCII码值不是一个值而是三个,准确的说光标键的ASCII码值是一个组合. 每个方向键所对应的三个键值为:0x1b + 0x5b + n ...
- Gradle 项目打开自动下载Zip问题及相关配置
原因 : 由于使用Eclipse开发,导入了SpringCloud 工程,SpringCloud 自从哪个版本忘了昂,选择了Gradle 作为工程管理工具,至于为啥,你去问问官方,我的了解是为了支持G ...
- java汉字占用字节
若使用utf-8编码,中文占3个字节,英文的话只占一个字节 System.out.println("人".getBytes().length); 输出3 若使用unicode编码, ...