加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

linux内核调试debug控制方式

(2020-05-22 21:48:37)
标签:

linux

driver

debug

杂谈

分类: programming
内核调试是很繁琐的,在这来理一理基本思路,参考TI的技术文档,linux系统基本框架如图所示.
linux内核调试debug控制方式

内核日志系统架构如图。

linux内核调试debug控制方式


内核日志系统缓冲区大小可以在编译时确定:menuconfig: “General Setup”
         Method #1: Kernel Config Option - CONFIG_LOG_BUF_SHIFT=n
也可以在内核启动参数指定:uboot bootargs: log_buf_len=n, buffer= 2^n, n=16时为64k,17时为128k

dmesg可以显示内核日志信息,“dmesg -c",在显示内核日志后清除日志信息,"dmesg -C"清除日志信息,

内核显示-printk()

格式化输出到内核日志缓冲区,是内核日志系统Logging API的基础。
示例如下,其中,KERN_ALERT是输出控制级别参数
       printk(KERN_ALERT "DBG: passed %s %d\n", __FUNCTION__, __LINE__)

内核定义了8个打印级别控制,如下
linux内核调试debug控制方式
用户空间dmesg可以控制显示级别,如:
      dmesg -n 5     |
                设置输出级别为KERN_WARNING,这个级别之上的才会显示  
      dmesg -l warn
                只显示级别为KERN_WARNING的日志信息

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的直接调用
    • 用户设备驱动日志控制,可以通过设备驱动使能或禁止
linux内核调试debug控制方式

pr_debug()和dev_dbg(),这2个宏可以在编译是控制是否使能,定义如下,在使能CONFIG_DYNAMIC_DEBUG和DEBUG后可以输出打印信息
===========================================

#if defined(CONFIG_DYNAMIC_DEBUG)

#define pr_debug(fmt, ...) \
    dynamic_pr_debug(fmt, ##__VA_ARGS__)
#elif defined(DEBUG)
#define pr_debug(fmt, ...) \
    printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
#else
#define pr_debug(fmt, ...) \
    no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
#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
=================================================

使能DEBUG/VERBOSE_DEBUG, 可以通过三个方式:
  •    内核配置时选择
  • Makefile里添加-DDBUG 或-DVERBOSE_DBUG
  • 在要debug的c文件中添加“#define VERBOSE_DEBUG“ 或者“#define DEBUG“
使能GPIO驱动,可以看到,在文件./drivers/gpio/Makefile
               ccflags-$(CONFIG_DEBUG_GPIO) += -DDEBUG
在对应的Kconfig中定义
               ./drivers/gpio/Kconfig:63:config DEBUG_GPIO

或者在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控制   

动态使能内核debug代码,动态获得日志信息,包括
  • pr_debug()/dev_dbg()
  • print_hex_dump_debug()/print_hex_dump_bytes()
控制接口概要
        控制方法:
  1.  行号或范围
  2. 函数名
  3. 文件名
  4. 模块名
控制接口
  1. debugfs
  2. linux启动命令行参数
   

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有