dynamic debug动态打印- pr_debug

     之前介绍过了 printk_once , 只打印一次。

     有些情况下,需要kernel运行时动态打印与否,dynamic debug就派上用场了。

     具体用法可以参考: kernel/Documentationdynamic-debug-howto.txt

     使用步骤:

       //  打印

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

       // 不打印
       echo  "file nand.c     -p"' > /sys/kernel/debug/dynamic_debug/control

       // 使用例子

       pr_debug("  dynamic debug \n");

 

       奇怪的是,加参数-c, 本地验证是不起作用的。

       至于为什么往 dynamic_debug/control 写入设置信息,可参考内核接口文件代码:

      

  1. static int __init dynamic_debug_init(void)  
  2. {  
  3.     struct dentry *dir, *file;  
  4.     struct _ddebug *iter, *iter_start;  
  5.     const char *modname = NULL;  
  6.     int ret = 0;  
  7.     int n = 0;  
  8.   
  9.     dir = debugfs_create_dir("dynamic_debug", NULL);  
  10.     if (!dir)  
  11.         return -ENOMEM;  
  12.     file = debugfs_create_file("control", 0644, dir, NULL,  
  13.                     &ddebug_proc_fops);  
static int __init dynamic_debug_init(void)
{
	struct dentry *dir, *file;
	struct _ddebug *iter, *iter_start;
	const char *modname = NULL;
	int ret = 0;
	int n = 0;

	dir = debugfs_create_dir("dynamic_debug", NULL);
	if (!dir)
		return -ENOMEM;
	file = debugfs_create_file("control", 0644, dir, NULL,
					&ddebug_proc_fops);


 

记得要编译kernel的时候使能,让dynamic debug编译进去。(menuconfig)

  │ Symbol: DYNAMIC_DEBUG [=y]                                                                                                         │ 
  │ Prompt: Enable dynamic printk() support                                                                                            │ 
  │   Defined at lib/Kconfig.debug:1039                                                                                                │ 
  │   Depends on: PRINTK [=y] && DEBUG_FS [=y]                                                                                         │ 
  │   Location:                                                                                                                        │ 
  │     -> Kernel hacking   

   或者直接修改

   ./config 文件
   CONFIG_DYNAMIC_DEBUG=y

   注意的是其依赖于: Depends on: PRINTK [=y] && DEBUG_FS [=y]      

<think>嗯,用户问的是pr_info和pr_debug的区别。我需要先回忆一下Linux内核中的打印函数。记得内核里有多个打印级别,比如pr_emerg、pr_alert、pr_crit、pr_err、pr_warning、pr_notice、pr_info,还有pr_debug这些。它们都属于内核的日志系统,但用途和输出条件可能不同。 首先,pr_info应该用于普通的信息性消息,而pr_debug则用于调试信息。可能区别在于默认的日志级别和编译选项。比如,pr_debug可能只有在定义了DEBUG宏或者开启CONFIG_DYNAMIC_DEBUG时才会被编译进去,而pr_info在默认情况下就会输出。 然后要确认它们的日志级别。pr_info对应的级别是KERN_INFO,而pr_debug对应的是KERN_DEBUG。内核的console_loglevel决定了哪些级别的信息会被显示出来。通常DEBUG级别可能不会被默认显示,需要调整日志级别才能看到pr_debug的输出。 另外,pr_debug可能依赖于编译时的配置。比如,在代码中如果没有定义DEBUGpr_debug可能会被预处理掉,不会编译进内核映像,这样可以减少代码大小。而pr_info则无论调试选项是否开启都会被保留。 还有动态调试(dynamic debug)的情况,pr_debug可以通过动态调试在运行时启用或禁用,而pr_info可能不行。动态调试允许在不需要重新编译内核的情况下,通过命令行控制调试信息的输出,这对于调试生产环境的问题很有用。 用户可能是在内核开发或者驱动开发中遇到了日志输出问题,了解在什么情况下该用哪个函数。需要强调使用场景:pr_info用于常规信息,pr_debug用于调试,且可能需要特别配置才能生效。可能还需要提到如何启用这些调试信息,比如修改日志级别、启用CONFIG_DYNAMIC_DEBUG,或者使用dmesg命令调整过滤条件。 需要确保回答准确,不混淆不同的打印函数,比如printk和pr_*系列的关系。可能还要提到pr_*宏是对printk的封装,添加了日志级别前缀,使得代码更简洁。 总结的话,应该分点说明区别:日志级别、编译选项依赖、默认可见性、动态调试支持等方面。这样用户能够清晰理解两者的不同应用场景和配置需求。</think>在 Linux 内核开发中,`pr_info` 和 `pr_debug` 都是内核日志输出函数(基于 `printk` 的封装),但它们的用途和行为有显著区别: --- ### 1. **日志级别** - **pr_info** 对应 `KERN_INFO` 级别,表示一般性信息(例如硬件初始化完成、模块加载成功等)。 默认会被输出到系统日志(`/var/log/messages` 或 `dmesg` 可见)。 - **pr_debug** 对应 `KERN_DEBUG` 级别,表示调试信息(例如函数调用路径、变量状态跟踪等)。 默认 **不会输出到日志**,需手动开启调试模式。 --- ### 2. **编译行为** - **pr_info** 无论内核配置如何,始终会被编译进代码。 通过 `CONFIG_PRINTK` 控制是否输出(默认开启)。 - **pr_debug** 依赖编译配置: - 若未定义 `DEBUG` 宏或未启用 `CONFIG_DYNAMIC_DEBUG`,`pr_debug` 会被编译器直接忽略,不生成代码。 - 若启用 `CONFIG_DYNAMIC_DEBUG`,可在运行时动态启用/禁用调试输出。 --- ### 3. **使用场景** - **pr_info** 适用于需要长期保留的、关键性状态信息(例如驱动加载成功、硬件状态变更)。 - **pr_debug** 适用于临时调试(例如排查内存泄漏、逻辑错误),调试完成后通常会移除或保持静默。 --- ### 4. **启用调试输出的方法** - **pr_info** 默认可见,无需额外配置。 - **pr_debug** 需满足以下条件之一: - 编译时定义 `DEBUG` 宏(例如在 Makefile 中添加 `ccflags-y := -DDEBUG`)。 - 启用 `CONFIG_DYNAMIC_DEBUG`,运行时通过命令控制: ```bash # 启用某文件的调试输出 echo "file driver.c +p" > /sys/kernel/debug/dynamic_debug/control ``` --- ### 总结对比表 | 特性 | pr_info | pr_debug | |---------------------|-----------------------|------------------------------| | **日志级别** | `KERN_INFO` | `KERN_DEBUG` | | **默认输出** | 是 | 否(需手动开启) | | **编译依赖** | 无条件编译 | 依赖 `DEBUG` 或动态调试配置 | | **适用场景** | 常规状态信息 | 临时调试信息 | 合理选择日志级别可以避免日志冗余,同时确保关键信息不被淹没在调试输出中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值