收藏 分享(赏)

嵌入式linux调试(farsight).ppt

上传人:天天快乐 文档编号:1300537 上传时间:2018-06-23 格式:PPT 页数:69 大小:3.02MB
下载 相关 举报
嵌入式linux调试(farsight).ppt_第1页
第1页 / 共69页
嵌入式linux调试(farsight).ppt_第2页
第2页 / 共69页
嵌入式linux调试(farsight).ppt_第3页
第3页 / 共69页
嵌入式linux调试(farsight).ppt_第4页
第4页 / 共69页
嵌入式linux调试(farsight).ppt_第5页
第5页 / 共69页
点击查看更多>>
资源描述

1、,The successs road,Linux调试,,写在前面,Linux内核或设备驱动程序的调试远比应用程序的调试繁琐、复杂!调试内核的关键是对内核的深刻理解要有汇编基础! 要有耐心!要有好运!,2.4内核中对调试的支持,2.6内核中对调试的支持,使用printk进行调试,printk的健壮性,printk的脆弱性,随时调用 在中断中调用 在进程上下文中调用 在持有锁时调用 在多处理器上同时使用,终端启动前无法调用,early_printk(),printk的记录等级,printk( KERN_WARNING “This is a warningn”);printk( KERN_DEBUG

2、 “This is a warning!n” );printk( “No LogLevel is specified!n” );,可供使用的记录等级,记录等级 说明0. KERN_EMERG紧急情况KERN_ALERT需要立即被注意到的KERN_CRIT临界情况KERN_ERR错误KERN_WARNING 警告KERN_NOTICE普通的,可能需要注意KERN_INFO非正式的KERN_DEBUG一般的调试信息,用户空间的守护进程-klogd,用来从记录缓冲区获取内核消息;只有日记级别小于console_loglevel,消息才能显示出来, console_loglevel的值可以通过sys_

3、syslogd系统调用进行修改;载入klogd时,可以使用-c标志改变终端的记录等级;运行klogd后,消息将追加到/var/log/messages;没有运行klogd,消息不会传递到用户空间,此时可以查看/proc/kmsg文件。,syslogd进程,保存klogd进程获取的内核消息到系统日志文件中;默认的文件是/var/log/messages;可通过/etc/syslog.conf文件重新配置;如果没有运行klogd进程,数据将保留在循环缓冲区中,直到某个进程读取和缓冲区溢出为止。,调试信息数据流传递流程图,其他应用程序调试信息printf,klogd进程,syslog库函数,控制台或

4、log文件,syslog进程,sys_syslog系统调用,_log_buf循环缓冲区,printk函数,用户空间,内核空间,提高日志级别,要查看调试信息,必须提高日志级别;读写/proc/sys/kernel/printk文件rootvm-2.6#cat /proc/sys/kernel/printk 6417设置当前日志级别的命令rootvm-2.6#echo 8 /proc/sys/kernel/printk,strace命令,显示程序调用的所有系统调用从内核接收信息,而且不需要以任何特殊的方式来构建内核。 -t:显示调用发生的时间-T:显示调用花费的时间-e:限定被跟踪的调用类型-o:

5、将输出定向到一个文件中,strace cp -o aa,oops,产生oops的原因:内存访问越界非法指令使用了NULL指针使用了不正确的指针值oops的内容:CPU寄存器内容页描述符表的位置其他信息,有问题的write程序,ssize_t faulty_write ( struct file *filp, const char _user *buf, size_t count, loff_t *pos ) *(int *)0 = 0;return 0;,有问题的read程序,ssize_t faulty_read ( struct file *filp, const char _user *

6、buf, size_t count, loff_t *pos ) int ret;char stack_buf4;memset(stack_buf,0xff,20);if(count 4) count=4;ret = copy_to_user(buf,stack_buf,count);if(!ret) return count;return ret;,oops产生时的转储信息,EIP:0010:Unable to handle kerel paging request at virtual address ffffffffprinting eip:ffffffffOops:0000#5SMPC

7、PU:0EIP:0060:Not taintedEFLAGS:00010296(2.6.6)EIP is at 0xfffffffeax:0000000cebx:ffffffffecx:00000000edx:bfffda7cesi:cf434f00edi:ffffffffebp:00002000esp:c27fff78ds:007bes:007bss:0068,oops产生时的转储信息(2),Process Head (pid:2331,threadinfo=c27fe000 task=c3226150)Stack: ffffffff bfffda70 00002000 cf434f20 0

8、0000001 00000286 cf434f00 fffffffbfffda70 c27fe000 c0150612 cf434f00 bfffda70 00002000 cf434f20 0000000000000003 00002000 c0103f8f 00000003 bfffda70 00002000 00002000 bfffda70Call Trace: sys_read + 0x42/0x70 syscall_call + 0x7/0xbCode: Bad EIP value,oop分析器,klogd:符号表与当前内核必须匹配。ksymoops:查看/proc/modules

9、获得模块的符号信息,从/proc/ksyms中取得内核符号表。,ksymoops filename.oops,格式化 Oops 消息,代码,oops消息,错误,运行kysmoops,格式化后的oops消息,oops产生时的转储信息,EIP:0010:Unable to handle kerel paging request at virtual address ffffffffprinting eip:ffffffffOops:0000#5SMPCPU:0EIP:0060:Not taintedEFLAGS:00010296(2.6.6)EIP is at 0xfffffffeax:00000

10、00cebx:ffffffffecx:00000000edx:bfffda7cesi:cf434f00edi:ffffffffebp:00002000esp:c27fff78ds:007bes:007bss:0068,查看日志获取系统状态,Linux的3个主要的日志子系统:连接时间日志/var/log/wtmp和/var/run/utmp进程统计日志pacct或acct错误日志由syslogd(8)执行,常用的日志文件,access-log-记录网络传输acct/pacct-记录用户命令btmp-记录失败的记录lastlog-最后登陆记录messages-从syslog中记录信息sudolog

11、 -sudo发出的命令sulog-su命令的使用utmp -记录当前登陆用户xferlog -记录ftp会话,gdb调试器,运行程序,给程序加所需的调试条件在给定的条件下让程序停止检查程序停止时的运行状态通过改变数据,更改程序的错误,gdb启动界面,gdb基本命令,filequitruninfolistbreak,watchprintsetstepnextcontinue,help,远程调试,运行调试器,指定调试通信端口向目标系统发送消息,目标操纵系统初始化到应用程序入口,主动触发异常,异常处理程序转到调试端口进行通信,gdb远程调试环境原理图,应用程序,远程主机,内核,stub程序,GDB/

12、XGDB,X Windows 环境,本地主机,串口/网络,arm-linux-gdb的创建,download gdb-.tar.bz2tar jxvf gdb-.tar.bz2./configure -target = arm-linux -prefix = /usr/local/arm-gdb vmakemake install,编译stub程序,export PATH=$PATH:/usr/local/arm-gdb/bin./configure -target=arm-linux -host=arm-linux在gdbserver目录运行:make CC=/usr/local/xxx/b

13、in/arm-linux-gcc在gdb目录下生成gdbserver,该程序在开发板上运行建立主机和开发板之间的TCP/IP连接,建立gdb和gdbserver连接,在目标板上运行gdbserverrootvm /root# ./gdbserver 192.168.1.1:2345 helloProcess hello created; pid=1000Listening on port 2345将hello程序复制到主机的相应目录,执行arm-linux-gdb:./arm-linux-gdb hello连接到开发板(gdb) target remote 192.168.1.1:2345,K

14、DB介绍,Linux内核调试器是Linux内核的补丁,提供了一种在系统能运行时对内核内存和数据结构进行检查的办法。不允许进行源代码级别上的调试。可以添加额外的命令,给出该数据结构的标识或地址,这些命令便可以格式化和显示基本的系统数据结构。,KDB允许的内核操作,处理器单步执行执行到某条特定指令时停止当存取(或修改)某个特定的虚拟内存位置时停止当存取输入/输出地址空间中的寄存器时停止 对当前活动的任务和所有其它任务进行堆栈回溯跟踪(通过进程 ID)对指令进行反汇编 追击内存溢出,配置KDB,tar jxvf linux-xxx.tar.bz2bzip2 -d xxx.patch.bz2patch

15、 -p1 Built-in Kernel Debugger support设置CONFIG_FRAME_POINTER选项Compile the kernel with frame pointers设置CONFIG_KDB_OFF选项KDB off by default,激活KDB,激活:echo “1” /proc/sys/kernel/kdb取消激活:echo “0” /proc/sys/kernel/kdb,KDB命令(1),运行go:继续程序执行 ss:单步执行程序 ssb:执行到分支或者函数调用时停止,KDB命令(2),内存显示和修改md :显示内存内容 mdr :显示原始内存的内容

16、 mm :修改内存内容 (thinking mmW) mds :以符号的方式显示内存的内容,例1: 显示从0x30000000开始的30行内存0 kdb md 0x30000000 15例2: 修改0x20000000上的内存0 kdb mm 0x20000000 0x33,KDB命令(3),寄存器修改和显示rd :显示寄存器内容 rm :修改寄存器的内容 ef :显示异常帧,例1: 显示通用寄存器组0 kdb rd例2: 设置eax寄存器内容0 kdb rm eax,0x22,KDB命令(4),断点bp/bl :设置或者显示断点 bc/be :清除/激活断点 bd :使断点无效 bpa :设

17、置或者显示全局断点 bph/bpha:设置硬件断点或者显示所有断点,例1: 为函数设置断点0 kdb bp func_1例2: 列出断点0 kdb bl例3: 清楚断点0 kdb bc 1,KDB命令(5),堆栈bt :显示调用堆栈 btp :显示进程的堆栈 bta :显示所有进程的堆栈 btc :命令对每个活动 CPU 上正在运行的进程执行堆栈回溯,例1: 跟踪当前活动线程的堆栈0 kdb bt例2: 跟踪某进程的堆栈0 kdb btp 888,KDB命令(6),其他数十个命令help :获得帮助 ? :获得帮助 ,KGDB,使用两台计算机开发:,stty ispeed 115200 osp

18、eed 115200 -F /dev/ttyS0echo hello /dev/ttyS0,stty ispeed 115200 ospeed 115200 -F /dev/ttyS1cat /dev/ttyS1,安装KGDB,需要软件:内核源代码:linux-x.x.x.tar.bz2Kgdb补丁:linux-x.x.x-kgdb-1.9.patchgdbmod-x.x.bz2 配置内核,make; make bzImage,串口线的连接,开发机的配置,编辑文件.gdbinit:#vi .gdbinitdefine rmtset remotebaud 115200target remote

19、/dev/ttyS0end,目标机的配置,编辑/etc/grub.conf文件 #vi /etc/grub.conftitle Red Hat Linux (kernel_with_kgdb)root (hd0,0)kernel /boot/vmxxx-kgdb ro root=/dev/hda1 kernel /boot/vmxxx-kgdb ro root=/dev/hda1 / gdb gdbttyS=1 gdbbaud=115200 debugkernel文件#vi debug#!/bin/bashgdbstart -s 115200 -t /dev/ttyS1 EOFEOF,内核启动

20、后调试,启动完成后运行debugkenel,这时内核停止运行,在控制台屏幕上显示信息,等待来自开发机的串口连接,#./debugkernelAbout to activate GDB stub in the kernel on /dev/ttyS1Waiting for connection from remote gdb.,开发机的连接过程,目标机上的内核处于调试状态,可以查看变量、堆栈、设置断点等和GDB类似的功能,Linux Trace Toolkit,Linux kernel module takes care of storing the events into its buffer

21、 and then signals the trace daemon when it reaches a certain threshold. reads the data from the module, which is visible from user space as a character device the data decoder takes the raw trace data and puts it in a human-readable format while performing some basic and more advanced analysis,配置LTT

22、,配置Relay文件系统,ltt安装,安装内核补丁安装ltt补丁编译ltt./configuremakemake install挂载relay文件系统mount t relayfs relayfs /mnt/relay,ltt主界面,事件图,事件图,进程分析,进程分析,Raw Trace,Reference,Linux Device Drivers(3rd)A practical guide to the design and implementation of the Linux kernel(2nd)Debugging with GDBLinux Trace Toolkit Referen

23、ce Manual Monitoring and Analyzing RTAI System Behavior Using the Linux Trace ToolkitProcess Tracing with the Linux Trace ToolkitMastering Linux debugging techniques,Reference(2),使用kgdb调试linux内核及内核模块 -xcspy成员 ladybug Linux内核调试器内幕 Linux内核调试工具:Kdb应用指南,更多信息,Linux调试高级技巧嵌入式Linux系统性能优化嵌入式Linux的电源管理Linux实时性的设计嵌入式Linux的快速启动技术,高级专题系列,谢谢!,The successs road,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报