你一定在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. Asp .Net Core 系列:详解授权以及实现角色、策略、自定义三种授权和自定义响应

    什么是授权(Authorization)? 在 ASP.NET Core 中,授权(Authorization)是控制对应用资源的访问的过程.它决定了哪些用户或用户组可以访问特定的资源或执行特定的操作 ...

  2. Jmeter参数化1-随机数设置

    背景:当新增接口的某个字段是唯一性,每次调用该新增接口都会需要单独传入这个字段,麻烦且繁琐. 解决:jmeter设置随机数参数,然后接口调用该参数就达到了自动性不再需要人工传入不同的值.方便调用接口, ...

  3. SpringBoot配置过滤器、拦截器

    拦截器概述 Spring Boot提供了一种简单且强大的方式来定义和使用拦截器(Interceptor).Spring Boot的拦截器基于Spring框架的拦截器机制,可以在请求的处理过程中插入自定 ...

  4. OpenAI —— CLIP: Connecting text and images

    项目地址: https://openai.com/index/clip Github代码地址: https://github.com/openai/CLIP

  5. python之理解super及MRO列表 ( 示例版 )

    例子   1: class A0: def pri(self): super().pri() print("A0") class A1(A0): def pri(self): su ...

  6. git在idea中的冲突解决(非常重要)

    1.什么是冲突 冲突是指当你在提交或者更新代码时被合并的文件与当前文件不一致.读起来有点绕,结合下面的案例理解. 从上面对冲突的定义来看,冲突时发生在同一个文件上的. 2.生产上冲突的场景 常见冲突的 ...

  7. 生态兼容性进一步提升!白鲸开源 WhaleStudio 与火山引擎ByteHouse完成产品互认

    数据作为新型生产要素,已快速融入生产.分配.流通.消费和社会服务管理等各环节,深刻改变着生产方式.生活方式和治理方式.越来越多企业也在尝试充分利用数据要素,开辟全新发展路径,进一步实现业务价值提升. ...

  8. Apache SeaTunnel k8s 集群模式 Zeta 引擎部署指南

    SeaTunnel提供了一种运行Zeta引擎(cluster-mode)的方法,可以让Kubernetes在本地运行Zeta引擎,实现更高效的应用程序部署和管理.在本文中,我们将探索SeaTunnel ...

  9. java关于数组的复制,反转、查找

    一.数组的赋值: arr2=arr1;对于该赋值而言,地址值一样,所以arr1会随着arr2的变化而变化.这不能称作数组的复制,因为只是把地址赋过去了.地址一样,指向的是堆空间中唯一的数组实体(数值) ...

  10. 9组-Alpha冲刺-5/6

    一.基本情况 队名:不行就摆了吧 组长博客: https://www.cnblogs.com/Microsoft-hc/p/15546711.html 小组人数: 8 二.冲刺概况汇报 谢小龙 过去两 ...