你一定在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帮助调试的更多相关文章

  1. linux dynamic debug 官方教程

    下载内核后,文档在:Documentation/dynamic-debug-howto.txt 中文版本:http://www.oschina.net/translate/dynamic-debug- ...

  2. debug断点调试

    debug断点调试  1,虫子启动2,F6   执行断点的下一步,下一个语句     F5    进入方法     F8   执行到结束    查看表达式的值:选中查看的表达式,接着按   ctrl ...

  3. Eclipse开发环境debug模式调试断点从jar跳到源码

    Eclipse开发环境debug模式调试断点从jar跳到源码 说明:本案例使用jsch-0.1.54.jar和源码做test,项目分成两个,一个是jsch的源码,另一个是测试案例 一.下载JSch.的 ...

  4. Android调试大法 自定义IDE默认签名文件==>微信支付、微信登录、微信分享,debug时调试通过,release时调不起微信

    转载地址:http://blog.yanzhenjie.com Android调试大法之自定义IDE默认签名文件,你是否为调试第三方SDK时debug签名和release签名发生冲突而烦恼?你是否在d ...

  5. IIS调试技术之 Debug Diagnostic (调试诊断)

    IIS 调试技术之 Debug Diagnostic (调试诊断) 1      概述 1.1  文档简介 系统出现错误或崩溃,免不了要进行调试.调试能进行的前提是错误能重现,但实际上要重现一个错误有 ...

  6. 设置Eclipse可以Debug模式调试JDK源码,并显示局部变量的值

    最近突然萌发了研究JDK源码的想法,所以就想到了在自己常用的Eclipse上可以调试JDK源码. 整个设置过程也很简单: 首先你要安装好JDK(我的JDK安装路径根目录是D:\Java\jdk-8u9 ...

  7. (转)Intellij IDEA 2017 debug断点调试技巧与总结详解篇

    背景:详细介绍idea的debug调试过程 Intellij IDEA 2017 debug断点调试技巧与总结详解篇

  8. 高通平台打开 dynamic debug方法【学习笔记】

    一.首先在内核的配置文件添加如下的配置: CONFIG_DEBUG_FS=y CONFIG_DYNAMIC_DEBUG=y 二.找到自己平台对应的 device/qcom/xxxx/init.targ ...

  9. Debug代码调试

    Debug代码调试 第一步在代码左侧先点一个红点 第二步右键选择Debug运行 第三步点击Step Into按键分步进行 练习题: s2 = 'python python python python ...

  10. Dynamic CRM插件调试与单元测试

    背景 使用Dynamic CRM平台开发完业务插件后,不可避免的就是进行插件调试,测试插件是否正常运行,网上关于Dynamic CRM的资料比较少,但对于调试的博客还是挺多的,足可见插件调试对于Dyn ...

随机推荐

  1. 【AppStore】IOS应用上架Appstore的一些小坑

    前言 上一篇文章写到如何上架IOS应用到Appstore,其中漏掉了些许期间遇到的小坑,现在补上 审核不通过原因 5.1.1 Guideline 5.1.1 - Legal - Privacy - D ...

  2. springsecurity使用:登录与校验

    首先是引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  3. 我用Awesome-Graphs看论文:解读GraphBolt

    GraphBolt论文:<GraphBolt: Dependency-Driven Synchronous Processing of Streaming Graphs> 前面通过文章&l ...

  4. 【ElasticSearch】01 CRUD操作

    1.资料: ES官网最新版本下载地址: https://www.elastic.co/cn/downloads/elasticsearch 历史版本下载: https://www.elastic.co ...

  5. Accurately computing running variance —— 已知两个数列各自的均值和方差,如何快速求出两个数列拼合后的均值和方差(续)

    原内容来自: https://www.johndcook.com/blog/standard_deviation/ 计算公式: 该种计算方式可以只保存历史数据的平方和,与历史数据的和. 相关前文: 已 ...

  6. git警告信息:Encountered 1 file(s) that may not have been copied correctly on Windows: —— See: `git lfs help smudge` for more details.

    git报警信息: 官方讨论的帖子: https://github.com/git-lfs/git-lfs/issues/2434 说下个人的理解: 在git管理中,对于大文件(一般为压缩后的二进制文件 ...

  7. If Messi doesn't understand how to respect others, then he also doesn't deserve to receive respect from others.

    If Messi doesn't understand how to respect others, if he doesn't understand the spirit of honoring c ...

  8. python代码实现将PDF文件转为文本及其对应的音频

    代码地址: https://github.com/TiffinTech/python-pdf-audo ============================================ imp ...

  9. java多线程之-线程池状态

    1.背景 这一节我们来学习一下线程池状态..... 2.线程池状态 状态名称 高3位 是否接受新任务 是否处理队列中的任务 说明 RUNNING 111 是 是 线程池正常运行状态 SHUTDOWN ...

  10. Tim定时器初始化的方法

    #include "stm32f10x.h" // Device header void TimerInit(void) { RCC_APB1PeriphClockCmd(RCC_ ...