Linux 动态调试

Linux 内核的动态调试
一、背景
调试android 内核的可能清楚,对于一些概率性的问题,能够正确抓到日志是有多么重要。但是,为了不影响用户的正常使用,保证良好的使用性能,log必须控制在一定的量。但是对于一些涉及到协议相关的,为了方便调试,又必须加入一些打印数据的日志。这个时候,用户性能和调试需求产生了冲突。
如何解决这个问题呢?其实linux 已经考虑到这些问题。

  1. linux 引入log调试的概念
    linux内核引入了log等级这一概念,linux log等级分为8个等级,分别从0 - 7等级,详细请参考内核代码:kern_levels.h
8  #define KERN_EMERG	KERN_SOH "0"	/* system is unusable */
9  #define KERN_ALERT	KERN_SOH "1"	/* action must be taken immediately */
10  #define KERN_CRIT	KERN_SOH "2"	/* critical conditions */
11  #define KERN_ERR	KERN_SOH "3"	/* error conditions */
12  #define KERN_WARNING	KERN_SOH "4"	/* warning conditions */
13  #define KERN_NOTICE	KERN_SOH "5"	/* normal but significant condition */
14  #define KERN_INFO	KERN_SOH "6"	/* informational */
15  #define KERN_DEBUG	KERN_SOH "7"	/* debug-level messages */
  1. linux 引入log的动态打印概念
    以高通平台为例,使用如下指令,挂载debugfs文件系统
mount -t debugfs /debugfs /sys/kernel/debug

看出自己的文件是否支持动态调试

cat /sys/kernel/debug/dynamic_debug/control

如何动态打印
1) 打印一个文件中的所有动态打印语句,以gadget.c为例

echo -n "file gadget.c +p" > /sys/kernel/debug/dynamic_debug/control


2) 打印一个模块中所有动态打印语句

echo -n "module dwc3 +p" > /sys/kernel/debug/dynamic_debug/control

3 打开一个函数中所有动态打印语句

echo -n "func port_event +p" >  /sys/kernel/debug/dynamic_debug/control
  1. 打开文件路径中包含usb的文件里所有的动态打印语句
echo -n "*usb* +p" > /sys/kernel/debug/dynamic_debug/control

需要根据自己的需要,开启日志等级。
两种方式

  1. 使用命令开启log等级
    dmesg -n 8
  2. 直接echo 设置
echo 7 > /proc/sys/kernel/printk

最后一点需要主要,这里的打印都是动态打印语句。什么是动态打印语句?
1.定义在内核代码头文件中include/linux/device.h

#define dev_dbg(dev, fmt, ...)	\
dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
  1. 开启动态调试,需要开启宏CONFIG_DYNAMIC_DEBUG
  • 13
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Linux 驱动调试是开发者在开发和调试Linux内核驱动程序时经常遇到的任务。下面是一些常用的Linux驱动调试方法: 1. 打印调试信息: 在驱动程序中使用printk或者dev_printk函数输出调试信息。由于驱动程序运行在内核空间,因此可以使用printk函数将调试信息输出到内核日志中。通过查看内核日志,可以了解内核执行过程中驱动程序相关的信息。 2. 开启内核调试功能: 使用kdb、kgdb或者kgdboc等工具来开启内核调试功能。这些工具可以通过调试界面或者串口连接到内核进行调试。通过设置断点、单步执行等操作,可以对驱动程序进行详细的调试。 3. 使用调试工具: Linux内核提供了一些调试工具,如kprobe、kprobe-based-trace等。这些工具可以用于在运行时跟踪内核函数的调用和参数,并通过利用perf工具进行性能分析。针对特定问题,可以使用ftrace来进行函数追踪和性能分析。 4. 使用模拟环境: 在某些情况下,为了调试驱动程序,可以使用模拟环境。如使用qemu来模拟运行某个特定的硬件平台,以便方便地进行驱动程序的调试。 5. 动态打印调试信息: Linux内核提供了一些函数(如dynamic_debug_enable)来动态控制驱动程序打印调试信息的级别。通过在驱动程序中使用动态调试宏(如pr_debug),可以根据需要在运行时动态地输出调试信息。 总结起来,Linux驱动调试方法包括打印调试信息、开启内核调试功能、使用调试工具、使用模拟环境以及动态打印调试信息等。这些方法可以帮助开发者定位和解决驱动程序中的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值