Linux内核编程(六)----------驱动开发基础二

写在前面:Linux内核的基本调试方法。

 

正文:

    1、prink :始终是调试内核最有效的工具,
        
        (1)、级别:日志级别用宏定义,日志级别宏展开为一个字符串,在编译时由预处理器将它和消息文本拼接成一个字符串,因此printk函数中日志级别宏和格式字符串间不能有逗号。
            printk的日志级别定义:include/linux/printk.h    数字越小级别越高
            #define KERN_EMERG    "<0>"    /* system is unusable            */
            #define KERN_ALERT    "<1>"    /* action must be taken immediately    */
            #define KERN_CRIT    "<2>"    /* critical conditions            */
            #define KERN_ERR    "<3>"    /* error conditions            */
            #define KERN_WARNING    "<4>"    /* warning conditions            */
            #define KERN_NOTICE    "<5>"    /* normal but significant condition    */
            #define KERN_INFO    "<6>"    /* informational            */
            #define KERN_DEBUG    "<7>"    /* debug-level messages            */
            
            日志级别的范围是0~7,没有制定日志级别的printk语句默认采用的级别是 #define DEFAULT_MESSAGE_LOGLEVEL 4(printk.c中),表示当printk语句的级别高于4(即宏的数字的大小小于4),将在终端上打印,也就是printk级别为4,5,6,7
不会在终端上打印。
            如下命令可以使所有打印输出到终端上,  echo 8 > /proc/sys/kernel/printk     //这个命令的意思也就是把打印级别设置到了8
        (2)、 dmesg: 通过查看 /proc/kmsg 文件可以打印所有的内核信息 ,即dmesg可查看printk的所有基本的打印信息。
        (3)、打开和关闭调试信息: 驱动程序一般可以通过使用宏定义打开或者关闭调试信息。
            #ifdef FT_DEBUG
            #define DEBUG(n, args...) printk(KERN_DEBUG args)
            #else
            #define DEBUG(n, args...)
            #endif

    

    2、oops,这是内核发生panic(崩溃)时,产生的一个调试信息。发生panic的时候,log里面会有PC、LR、SP等寄存器的值,
        其中:PC,指发生死机时正在执行的函数;LR,指调用死机时执行函数的函数;SP,堆栈寄存器。

    3、kprobe:这个工具用于调试在运行的内核中的代码。是个内核模块,需要加载到内核里面来进行调试。

      下面插入一段kprobe的调试代码:

    

#include <linux/module.h>
#include <linux/kprobes.h>
#include <linux/kallsyms.h>
#include <linux/sched.h>
#include <linux/init.h>
#include <linux/kernel.h>

MODULE_LICENSE("GPL");//许可证、版权
MODULE_AUTHOR("kiran");//作者
MODULE_DESCRIPTION("hello demo");//模块描述
MODULE_VERSION("1.0");// 版本号

struct kprobe kp;

int handler_pre(struct kprobe *p ,struct pt_regs *pregs)
{
	printk(KERN_INFO "pt_regs: %p,pid : %d, jiffies: %ld\n",pregs,current->tgid,jiffies);
	
	return 0;
}

static __init int init_kprobe_sample(void)
{
	kp.symbol_name = "do_execve"; // 即要测试的函数的名称
	kp.pre_handler = handler_pre; //在执行do_execve 这个函数之前先执行 handler_pre
	
	register_kprobe(&kp); //注册这个kprobe
	
	return 0;
	
}

static __exit void cleanup_kprobe_sample(void)
{
	unregister_kprobe(&kp);  //卸载kprobe

}
module_init(init_kprobe_sample);  //模块的入口   insmod命令时就会执行module_init 加载的函数
module_exit(cleanup_kprobe_sample);  //模块的出口   rmmod命令时就会执行module_exit 加载的函数

    4、kcore:这是在运行的内核的内存映像文件,位置是:  /proc/kcore
 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KiranWang

一起努力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值