嵌入式Linux开发——(十六)Linux内核调试技术

2019-07-12 16:45发布

1、内核打印函数printk

    ①printk函数与printf函数用法格式完全相同     ②它所打印的字符串头部可以加入“”样式字符,n=0---7表示这条信息的记录  级别     ③对于printk(“......”)只有n小于console_loglevel时,这条信息才会被打印     ④   #  cat  /proc/sys/kernel/printk         得到     7                4                 1                   7         Console_loglevel  default_message_loglevel  minimum_console_loglevel     default_console_loglevel         对相应值进行修改:         #  echo “1  4  1  7” >  /proc/sys/kernel/printk     ⑤串口控制台        将printk信息从串口输出

2、内核源码级别的调试

    ①内核调试工具KGDB        A、使用KGDB时,需要两台机器,即主机和目标机,两者通过串口线相连,  在目标机上运行KGDB进行内核调试,在主机                上运行GDB        B、KGDB是一个内核补丁,将内核打上KGDB补丁后,才能使用GDB来调试        C、KGDB补丁给内核添加了3个部件:              1、GDB stub:调试插桩,用于处理主机GDB发来的各种请求              2、修改异常处理函数              3、串口通信:GDB和stub之间通过GDB串口协议进行通信

3、结合可视化图形前端DDD和GDB来调试内核

     ①DDD(Data Display Debugger)命令行调试程序          通过DDD来调用GDB来调试内核,可以在图形界面上完成调试工作      ②GDB调试器      功能:             A、启动程序,并指定各类影响程序运行的参数             B、使程序在指定条件下停止运行            C、当程序停止时,观察各种状态            D、修改程序的执行参数

4、Oops信息及栈回溯

    ①当内核出错时,打印出来的信息称为Oops信息     ②配置内核时Oops信息的栈回溯信息更直观     ③一个程序包含代码段、数据段、BSS段、堆、栈         数据段:存放初始值不为0的全局数据         BSS段:存放初始值为0或无初始值的全局数据         堆:用于动态内存分配         栈:实现函数调用,存放局部变量     ④在调用函数之前,会将返回地址存放在lr地址寄存器中,通过lr寄存器的值,便可以知道调用者是谁,这样一步步往上找,            就可以知道各个调用函数,这就是栈回溯原理