linux内核调试debug控制方式

标签:
linuxdriverdebug杂谈 |
分类: programming |
内核调试是很繁琐的,在这来理一理基本思路,参考TI的技术文档,linux系统基本框架如图所示.
内核日志系统架构如图。
内核日志系统缓冲区大小可以在编译时确定:menuconfig: “General Setup”
也可以在内核启动参数指定:uboot bootargs: log_buf_len=n, buffer= 2^n,
n=16时为64k,17时为128k
dmesg可以显示内核日志信息,“dmesg -c",在显示内核日志后清除日志信息,"dmesg
-C"清除日志信息,
内核显示-printk()
格式化输出到内核日志缓冲区,是内核日志系统Logging API的基础。
示例如下,其中,KERN_ALERT是输出控制级别参数
内核定义了8个打印级别控制,如下

用户空间dmesg可以控制显示级别,如:
pr_*()和dev_*()
-
pr_emerg, pr_alert, pr_crit, pr_err, pr_warning, pr_notice, pr_info pr_debug -
- printk相应的调试级别宏定义,用来替代printk的直接调用
- dev_emerg, dev_alert, dev_crit, dev_err, dev_warn, dev_notice, dev_info dev_dbg
-
- printk相应的调试级别宏定义,用来替代printk的直接调用
- 用户设备驱动日志控制,可以通过设备驱动使能或禁止

pr_debug()和dev_dbg(),这2个宏可以在编译是控制是否使能,定义如下,在使能CONFIG_DYNAMIC_DEBUG和DEBUG后可以输出打印信息
===========================================
#if defined(CONFIG_DYNAMIC_DEBUG)
#define pr_debug(fmt, ...) \
#elif defined(DEBUG)
#define pr_debug(fmt, ...) \
#else
#define pr_debug(fmt, ...) \
#endif
============================================
#if defined(CONFIG_DYNAMIC_DEBUG)
#define dev_dbg(dev, format, ...)
\
do {
\
dynamic_dev_dbg(dev, format, ##__VA_ARGS__); \
} while (0)
#elif defined(DEBUG)
#define dev_dbg(dev, format, arg...)
\
dev_printk(KERN_DEBUG, dev, format, ##arg)
#else
#define dev_dbg(dev, format, arg...)
\
({
\
if
(0)
\
dev_printk(KERN_DEBUG, dev, format,
##arg);
\
0;
\
})
#endif
#define dev_dbg(dev, format, ...)
do {
} while (0)
#elif defined(DEBUG)
#define dev_dbg(dev, format, arg...)
#else
#define dev_dbg(dev, format, arg...)
({
})
#endif
=================================================
使能DEBUG/VERBOSE_DEBUG, 可以通过三个方式:
-
内核配置时选择 - Makefile里添加-DDBUG 或-DVERBOSE_DBUG
- 在要debug的c文件中添加“#define VERBOSE_DEBUG“ 或者“#define DEBUG“
在对应的Kconfig中定义
或者在Makefile添加行EXTRA_CFLAGS += -DDEBUG
===========================================
config DEBUG_GPIO
bool "Debug GPIO calls"
depends on DEBUG_KERNEL
help
Say Y here to add some extra checks and diagnostics to GPIO
calls.
These checks help ensure that GPIOs have been properly
initialized
before they are used, and that sleeping calls are not made
from
non-sleeping contexts. They can make bitbanged
serial protocols
slower. The diagnostics help catch the type of
setup errors
that are most common when setting up new platforms or boards.
=====================================================
=====================================================
动态使能内核debug代码,动态获得日志信息,包括
- pr_debug()/dev_dbg()
- print_hex_dump_debug()/print_hex_dump_bytes()
控制接口概要
控制接口
行号或范围 - 函数名
- 文件名
- 模块名
- debugfs
- linux启动命令行参数
前一篇:sysfs虚拟文件系统架构