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寄存器的值,便可以知道调用者是谁,这样一步步往上找, 就可以知道各个调用函数,这就是栈回溯原理