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

1、内核打印函数printk

    ①printk函数与printf函数用法格式完全相同

    ②它所打印的字符串头部可以加入“<n>”样式字符,n=0---7表示这条信息的记录  级别

    ③对于printk(“<n>......”)只有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寄存器的值,便可以知道调用者是谁,这样一步步往上找,            就可以知道各个调用函数,这就是栈回溯原理

猜你喜欢

转载自blog.csdn.net/qq_38677310/article/details/82941428