Linux_Boot、内核和驱动调试诊断技术

上传人:飞*** 文档编号:48604193 上传时间:2018-07-18 格式:PPT 页数:31 大小:1.18MB
返回 下载 相关 举报
Linux_Boot、内核和驱动调试诊断技术_第1页
第1页 / 共31页
Linux_Boot、内核和驱动调试诊断技术_第2页
第2页 / 共31页
Linux_Boot、内核和驱动调试诊断技术_第3页
第3页 / 共31页
Linux_Boot、内核和驱动调试诊断技术_第4页
第4页 / 共31页
Linux_Boot、内核和驱动调试诊断技术_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《Linux_Boot、内核和驱动调试诊断技术》由会员分享,可在线阅读,更多相关《Linux_Boot、内核和驱动调试诊断技术(31页珍藏版)》请在金锄头文库上搜索。

1、无线接入产品事业部 驱动室 陈敷明 2013年2月Linux Boot、内核和驱动调 试诊断技术MakefileMakefile介绍介绍主要内容1. UBOOT调试诊断技术2. 嵌入式Linux内核调试诊断技术3. 嵌入式Linux驱动调试诊断技术MakefileMakefile介绍介绍一. UBOOT调试诊断技术UBOOT调试主要内容: 1.串口终端未初始化阶段,可以使用的调试方法介绍。 2.串口终端已初始化阶段,可以使用的调试方法介绍。 3.如何分析UBOOT的Crash DumpsMakefileMakefile介绍介绍一. UBOOT调试诊断技术1.串口终端未初始化正常UBOOT启动流

2、程,串口初始化比较靠后,在串口未 初始化前主要有以下三种方式获取程序运行信息。 1) 点灯 2) 往GPIO管脚输出高低电平,通过示波器测量电平值 3) 借助仿真器(如通过BDI查看pc值)也可在早期就初始化串口,以UBOOT-2011- 09_MPC8313平台代码为例:在设置了IMMRBAR后,MPC8313串口控制器中的寄存 器即可读写,所以可以选择初始化IMMRBAR后立即初 始化串口。此调试思路参考网上如何在单板上电之初 打印信息,具体实现参见源码。MakefileMakefile介绍介绍一. UBOOT调试诊断技术2.串口已初始化串口初始化后可以自己添加打印,但是UBOOT也提供了

3、 许多调试打印开关,定义对应的调试宏即可打开这些开 关。最重要的调试开关是DEBUG宏,可在 include/configs/MPC8313ECOMBA.h中定义。实践中发现定义该宏后,对FLASH所有操作会打印刷屏 ,影响调试效率,可以将对FLASH操作时的打印关闭 。可在cfi_flash.c中将debug(fmt,args.)定义为空 或 #undef DEBUG来关闭cfi_flash.c文件的打印。MakefileMakefile介绍介绍一. UBOOT调试诊断技术其它可能用到的打印开关: miiphyutil.c(common)MII_DEBUG mkimage.h(tools)M

4、KIMAGE_DEBUG cmd_mem.c (common)CMD_MEM_DEBUG command.c (common)DEBUG_COMMANDS hush.c(common)DEBUG_SHELL main.c(common)DEBUG_PARSER main.c(common)DEBUG_BOOTKEYS spd_sdram.c(archpowerpccpumpc83xx) SPD_DEBUGMakefileMakefile介绍介绍一. UBOOT调试诊断技术3.如何分析uboot的Crash DumpsBus Fault 0x00f8d70c, fixup 0x00000000M

5、achine check in kernel mode.Caused by (from msr): regs 00f52cf8 Unknown values in msrNIP: 00F8D70C XER: 0000005F LR: 00F8D6F4 REGS: 00f52cf8 TRAP: 0200 DAR: F9F68C00MSR: 00009002 EE: 1 PR: 0 FP: 0 ME: 1 IR/DR: 00GPR00: 00016ACC 00F52DE8 00000000 F9F68C00 00FA38EC 00000001 F9F68BF8 0000000BGPR08: 000

6、00002 00F55470 00000000 00F52D94 44004024 00000000 00FA2F00 C0F75000GPR16: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000GPR24: 00000000 00FA38EC 00F553C0 00F55480 00000000 00F52F80 00FA41C0 00000001Call backtrace:00000000 00F8F998 00F8FA88 00F8FAF8 00F90B5C 00F90CF8 00F8385

7、C00F79E6C 00F773B0machine checkMakefileMakefile介绍介绍一. UBOOT调试诊断技术以上述打印为例分析:由于打印出的函数都是重定位后的地址(都是数字), 需要经过一些处理才能显示函数名字,UBOOT官网提供了一 个解析工具用这个工具解析时需要知道重定位到ram的地址,最简单 的方法就是在include/configs/arch_config_file.h中定义 DEBUG调试宏,那么在UBOOT运行过程中会打印出如下信 息 . Now running in RAM - U-Boot at: 00f75000 .MakefileMakefile介绍介

8、绍一. UBOOT调试诊断技术此时就可知道重定位到RAM后的地址是0x00f75000,在 与你的链接地址(board/?/ config.mk中定义的TEXT_BASE)相减。我所用的单板上定义 的TEXT_BASE为0x40000000,所以差值就为0x40000000- 0x00f75000 = 0x3f08b000现在就可用uboot-backtrace.pl工具解析,即可获得函数 的调用栈关系。 - backtrace System.map 0x3f08b000MakefileMakefile介绍介绍二. 嵌入式Linux内核调试诊断技术内核调试也可分为终端未初始化阶段、终端已初始化

9、阶 段。终端未初始化阶段调试手段依然有限,仍然是通过点灯 、设置GPIO电平、提前初始化串口终端、借助于BDI工具等 调试手段。终端初始化后,内核就有许多调试方法。有些是内核自 带的,有些需要借助第三方工具。 如: 1)内核中自带的调试选项 2)内核Oops分析 3)BDI调试内核 4)KGDB调试内核 5)SystemTap使用(交叉编译没有成功) 6)Linux内核的ftrace功能 7)SYSRQ(邓工使用过该方法定位过内核死循环)下面对上面提到的调试方法逐一介绍。MakefileMakefile介绍介绍二. 嵌入式Linux内核调试诊断技术1.内核中自带的调试选项介绍 内核自带的调试功

10、能,主要通过以下几个途径来设置。1)编译时打开调试宏开关 如: *Device Drivers - *Memory Technology Device (MTD) support - *Debugging Debugging verbosity(0 = quiet, 3 = noisy) 调试阶段可选择2或3。*File systems - *Miscellaneous filesystems - Journalling Flash File System v2 (JFFS2) support JFFS2 debugging verbosity (0 = quiet, 2 = noisy) 调

11、试阶段可选1或2。MakefileMakefile介绍介绍二. 嵌入式Linux内核调试诊断技术2)内核启动参数里面加调试选项 较常用的Linux启动参数调试开关有: initcall_debug=1 打印内核各组件初始化函数的运行时间及返回值 lmb=debug 打印内核早期的lmb组件 debug 很早就将内核打印等级提高到KERN_DEBUG等级 bootmem_debug 打印bootmem组件相关内容,free显示内存小于实 际物理内存大小,因为kernel占用一定空间和一些 关键组件所分配的空间。这是通过添加 bootmem_debug打印分析得出的)MakefileMakefil

12、e介绍介绍二. 嵌入式Linux内核调试诊断技术3)修改设备树(powerpc架构特有) 设备树最后添加如下内容,这样可以使能boot-wrapper阶段 的打印。chosen linux,stdout-path = “/soc8313e0000000/serial4500“; MakefileMakefile介绍介绍二. 嵌入式Linux内核调试诊断技术2. 内核Oops分析Linux2.6自身具备的调试功能,可以使得打印出的Oops 信息更直观。通过Oops信息中PC寄存器的值可以知道出错指 令的地址,通过栈回溯信息可以知道出错时的函数调用关系 ,再结合反汇编找出具体函数中的出错处,根据这

13、几点可以 很快定位错误。要让内核出错时能够打印栈回溯信息,编译内核时要增 加“-fno-omit-frame-pointer”选项,这可以通过配置 CONFIG_FRAME_POINTER来实现。查看内核目录下的配 置文件.config,确保CONFIG_FRAME_POINTER已经被定 义,如果没有,执行“make menuconfig”命令重新配置内核。 CONFIG_FRAME_POINTER有可能被其他配置项自动选上 。Oops分析需要熟悉具体CPU架构的EABI和汇编代码,这 方面的资料参见嵌入式Linux调试诊断技术研究之内核篇 .doc ,下面是胡工在TD-SCDMA eNod

14、e项目上Oops分析的 两个经典案例。MakefileMakefile介绍介绍二. 嵌入式Linux内核调试诊断技术3.BDI调试内核 1)BDI配置 2)内核修改及配置 1、2具体操作步骤参见嵌入式Linux调试诊断技术研究之内 核篇.doc 3.2小节3)用BDI连接上单板,运行过程中输入halt指令,即可停止程序 运行,此时通过gdb连接单板即可开始调试。 具体操作步骤如下: BDIreset BDIhalt 此时程序停住,串口打印停止。 切换到虚拟机中,执行如下指令: powerpc-linux-gdb vmlinux (gdb)target remote bdi_ip:2001 连接

15、上之后即可进行设置断点、查询变量、单步执行等操作 。MakefileMakefile介绍介绍二. 嵌入式Linux内核调试诊断技术4.KGDB调试内核 1)Kgdb简介kgdb提供了一种使用gdb调试Linux内核的机制。使用 kgdb调试内核需要二台机器,一台作为开发机,另一台作为 目标机,通过串口将它们连接起来。在将要调试的内核中插 入kgdb,重新编译内核,使其运行在目标机上。而gdb在开发 机上运行,gdb通过串口与要调试的内核进行通信,对目标机 上的内核进行控制,从而实现远程调试内核的目的。MakefileMakefile介绍介绍二. 嵌入式Linux内核调试诊断技术2)Kgdb调试

16、步骤 需要打开如下内核配置选项: CONFIG_KGDB=y CONFIG_KGDB_SERIAL_CONSOLE=y 选项在 Kernel hacking 里可以找到,为了能在系统运行时中 断系统并触发远程 gdb,必须打开内核 Magic Sys-Rq 键选项 : CONFIG_MAGIC_SYSRQ=y 打开内核符号调试: CONFIG_DEBUG_INFO=y内核启动参数需要添加如下语句: kgdboc=ttyS0,115200 kgdbwait重新编译内核后,烧写进单板,单板重启后会出现waiting for字样。MakefileMakefile介绍介绍二. 嵌入式Linux内核调试诊断技术由于是通过串口连接单板,需要在虚拟机上添加1个串口。 选择VM-Settings-Hardware-Serial Port 单击Add 添加一个物理串口,并选择Use physical serial p

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号