【教学课件】第5课开发环境的建立和调试技术.ppt

上传人:小飞机 文档编号:5659098 上传时间:2023-08-06 格式:PPT 页数:52 大小:930.50KB
返回 下载 相关 举报
【教学课件】第5课开发环境的建立和调试技术.ppt_第1页
第1页 / 共52页
【教学课件】第5课开发环境的建立和调试技术.ppt_第2页
第2页 / 共52页
【教学课件】第5课开发环境的建立和调试技术.ppt_第3页
第3页 / 共52页
【教学课件】第5课开发环境的建立和调试技术.ppt_第4页
第4页 / 共52页
【教学课件】第5课开发环境的建立和调试技术.ppt_第5页
第5页 / 共52页
点击查看更多>>
资源描述

《【教学课件】第5课开发环境的建立和调试技术.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第5课开发环境的建立和调试技术.ppt(52页珍藏版)》请在三一办公上搜索。

1、1,嵌入式系统An Introduction to Embedded System浙江大学计算机学院2012年4月,第5课 开发环境的建立和调试技术,提纲,1、宿主机-目标机开发模式 2、目标机环境3、宿主机环境 4、远程调试原理5、GDB调式6、内核调试,4,嵌入式系统的设计流程,5,1、宿主机-目标机开发模式,6,2、目标机环境,2.1 JTAG接口简介 边界扫描测试,主要用于芯片内部测试。Joint Test Action Group。接JTAG下载线或接其他JTAG仿真器。,其他调试工具:示波器:板级硬件设计及调试,最原始的工具。有两类:模拟示波器和数据示波器逻辑分析仪:对微处理器总线

2、的数据解码,观察总线发生的传输事务。有两类:状态分析仪和时序分析仪。ICE在线仿真器:是一种用于替代目标机上的CPU的设备。,7,2.2 BootLoader LILOGRUBU-BOOT,8,3、宿主机环境,3.1 BOOTP协议 3.2 TFTP协议 3.3 交叉编译,9,3.1 BOOTP协议,BOOTP服务的全称是BootStrap Protocol 使用TCP/IP网络协议中的UDP 67/68两个通讯端口常用到的DHCP服务就是从BOOTP服务扩展而来的,10,第一步,在目标板由BootLoader启动BOOTP,此时目标板还没有IP地址,它就用广播形式以IP地址向网络中发出IP地

3、址查询的请求,这个请求帧中包含了客户机的网卡MAC地址等信息。,11,第二步,主机平台运行BootP服务的服务器接收到的这个请求帧,根据这帧中的MAC地址在Bootptab启动数据库中查找这个MAC的记录,如果没有此MAC的记录则不响应这个请求;如果有就将FOUND帧发送回目标板。FOUND帧中包含的主要信息有目标板的IP地址、服务器的IP地址、硬件类型、网关IP地址、目标板MAC地址和启动映象文件名。,12,第三步,目标板就根据FOUND帧中的信息通过TFTP服务器下载启动映象文件。,13,3.2 TFTP协议,TFTP服务的全称是Trivial File Transfer Protocol

4、 TFTP可以看成一个简化了的FTP TFTP在安装时一定要设立一个单独的目录作为TFTP服务的根目录,以减少安全隐患,14,3.3 交叉编译,宿主机与交叉编译交叉编译器及交叉编译环境的组成交叉编译环境的搭建制作 ARM 交叉编译器建立开发环境编写 crosstool 脚本文件编译,宿主机与交叉编译,交叉编译是嵌入式开发过程中的一项重要技术,简单地说,就是在一个平 台上生成另一个平台上的可执行代码。,交叉编译的主要特征是某机器中执行的程序代码不是由本机编译生成,而是由另一台机器编译生成,一般把前者称为目标机,后者称为主机,CPU指令集不相同,引入,交叉编译,交叉编译器及交叉编译环境的组成,当提

5、到交叉编译器时,不仅仅是指将一种编程语言的代码转换成对象代 码的软件,还指其他必要的开发工具:,Linux下的交叉编译环境,汇编器,连接器,基本工具,交叉编译环境的搭建,建立交叉编译环境主要常规 6 个步骤:,下载源代码,编译Binutils,配置Linux内核头文件,第一次编译GCC,交叉编译Glibc,第二次编译GCC,建立开发环境,WORKDIR,为了便于介绍,现约定在Linux下的工作目录:,SOURCEDIR,BUILDIR,TMPDIR,RESULTDIR,=$PWD,工作目录,=$WORKDIR/downloads,源码包,=$WORKDIR/build,编译目录,=$WORKD

6、IR/tmp,缓存目录,=/usr/crosstool,生成的交叉编译工具目录,编写 crosstool 脚本文件,针对我们所下载的源码包,我们需要定制我们的 crosstool 脚本文件,这里我们需要建立的文件有:,arm.dat:KERNELCONFIG=pwd/arm.config TARGET=arm-linux TARGET_CFLAGS=-O,arm.dat,BINUTILS_DIR=binutils-2.16 GCC_DIR=gcc-3.4.5 GLIBC_DIR=glibc-2.3.6 LINUX_DIR=linux-2.6.12 LINUX_SANITIZED_HEADER_

7、DIR=linux-libc-headers-2.6.12.0 GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.6,demo-arm.sh,编译,解压,将上面编写的三个脚本文件拷贝到 crosstool-0.42 目录:,转到工作目录,解压文件,执行脚本文件,$cd$BUILDIR,$sh demo-arm.sh,转到工作目录,$cd crosstool-0.42,21,4.远程调试的工作原理,通用的桌面操作系统与嵌入式操作系统在调试环境上存在明显的差别远程调试,调试器运行于通用桌面操作系统的应用程序,被调试的程序则运行于基于特定硬件平台的嵌入式操作系

8、统(目标操作系统),22,远程调试带来以下问题:调试器与被调试程序如何通信 被调试程序产生异常如何及时通知调试器 调试器如何控制、访问被调试程序 调试器如何识别有关被调试程序的多任务信息并控制某一特定任务 调试器如何处理某些与目标硬件平台相关的信息,23,4.1 插桩(stub),Stub方案是在目标操作系统和调试器内分别加入某些功能模块,二者互通信息来进行调试这一方案需要目标操作系统提供支持远程调试协议的通信模块和多任务调试接口,并改写异常处理的有关部分 目标操作系统还需要定义一个设置断点的函数,24,远程调试示意图:,25,4.2 GDB介绍,GDB是GNU C自带的调试工具,使用GDB可

9、以完成下面这些任务:运行程序,可以给程序加上所需的调试任何条件在给定的条件下让程序停止检查程序停止时的运行状态通过改变一些数据,可以更快地改正程序的错误,26,4.3GDB远程调试功能介绍,如果需要调试的程序和GDB所运行的环境不同,或者说需要调试的环境上根本无法运行起GDB,就需要使用远程调试功能 指定需要调试的远程机器的方法是使用target remote命令 在远程机器上,需要实现一个stub文件,在这个文件里面提供串口连接的协议,和传送数据信息的方法,27,GDB远程调试环境原理图:,28,5.使用GDB,5.1 GDB命令补齐功能 键入gdb gdb_test命令来启动GDB并载入程

10、序 gdb_test,命令行进入了GDB模式。,29,GDB中的常用命令如下:,30,31,5.2 断点与条件断点,GDB中的断点有四种状态:有效(Enabled)禁止(Disabled)一次有效(Enabled once)有效后删除(Enabled for deletion)条件断点的设置语句:,6.Linux 内核调试,Linux内核调试Printk、KGDB、KDB Linux 内核调试PrintkLinux 内核调试KGDBLinux 内核调试KDB,6.1 Linux内核调试,GO!,当内核运行出现错误的时候,首先要明确 定义和可靠地重视这个错误现象。,Linux内核,不包括,内核调

11、试,调试是软件开发过程中一 个必不可少的环节,在内 核开发的过程中也不可避 免地会面对如何调试内核 的问题。,对于庞大的 Linux 内核软件工程,单靠阅读代码查找问题已经非常困难,需要借助调试技术解决 BUG。,调试内核很难,实际上内核不同于其他软件工程。,内核的 BUG 是多种多样的。,需要在Linux内核里面做一些修改,并且提供一个stub文件 把stub,串口驱动程序和Linux内核编译连接在一起 利用这个核心启动的系统,在需要进行调试的时候,激活程序的断点,等待本地主机的连接然后,就可以进行内核的调试了,6.2Printk、KGDB、KDB,只有熟悉了内核各部分的代码实现,才能够找到

12、准确的跟踪点;只有熟悉操作系统的内核机制,才能准确地判断系统运行状态。进行调试有两种方法:将消息打印到屏幕上,或使用调试器,目前本文档中主要介绍printk,KGDB,KDB这三个调试工具。,Linux 内核调试Printk,printk()是调试内核代码时最常用的一种技术。在内核代码中的特定位置加 入 printk()调试调用,可以直接把所关心的信息打印到屏幕上printk 函数具有极好的健壮性,不受内核运行条件的限制,在系统运行期间 都可以使用。,printk()的脆弱之处,printk()函数的健壮性,1,2,+,健壮性是 printk()函数最容易让人们接受的一个特质,它可以在中断上下

13、文和进程上下文中调用,它可以在持有锁时调用,printk()函数的健壮性也有漏洞在系统启动过程中,在某些地方不能使用它,37,调试内核代码的时候,则可以用 printk()显示监视信息 printk()可以指定一个记录级别,在头文件 中定义了 8 种可用的日志级别字符串:KERN_EMERG 用于紧急事件消息,它们一般是系统崩溃之前提示的消息。KERN_ALERT 用于需要立即采取动作的情况。,38,KERN_CRIT 临界状态,通常涉及严重的硬件或软件操作失败。KERN_ERR 用于报告错误状态;设备驱动多用此级来报告来自硬件的问题。KERN_WARNING 警告可能出现问题,这类情况通常不

14、会对系统造成严重问题。KERN_NOTICE 正常情形的提示。许多与安全相关的状况用这个级别进行汇报。KERN_INFO 提示性信息。很多设备驱动启动时,用此级别打印相应的硬件信息。KERN_DEBUG 用于调试信息。,39,日志分析,在标准的Linux系统上,用户空间的守护进程klogd从记录缓冲区中获取内核消息,通过syslogd守护进程将他们保存在系统日志文件中 根据日志级别,内核可能会把消息打印到当前控制台上 内核在遇到运行错误时,会显示发生错误时处理器的状态,40,许多错误都是由于 NULL指针的使用或其他不正确的指针值的使用,这些错误通常会导致一个 oops 消息oops消息给开发

15、者许多信息,但是往往这些原始信息都是一些十六进制的内存地址,有两个工具可用来将其解析为符号:klogd ksymoops,Linux 内核调试KGDB,何谓KGDB?,启动你的程序,可以按照你的自定义的要求随心所欲的运行程序;可让被调试的程序在你所指定的调试的断点处停住;当程序被停住时,可以检查此时你的程序中所发生的事;动态的改变你程序的执行环境。,GDB 是 GNU 开源组织发布的一个强大的 UNIX 下的命令行调试工具,功能?,42,KGDB分析,KGDB适用于两种情况下的调试:开发者需要调试内核开发者需要调试驱动模块使用KGDB进行内核调试的步骤如下:下载当前使用内核的kgdb patc

16、h 在PC主机端安装patch运行make menuconfig命令,确保kgdb选项中的KERNEL_HACKING被选上,43,重新编译内核。把新生成的内核镜像zImage拷贝到开发板。在启动开发板上的内核前需要设置:gdb gdbttyS=0 gdbbaud=38400。在PC主机端,使用命令,44,KGDB分析(1),串口驱动程序模块和数据包传送函数用来初始化串口,定义在drivers/char/serial.c中,部分声明如下:struct serial_state*gdb_serial_setup(int ttyS,int baud)参数ttyS为串口号,baud为传输波特率。函数

17、返回该串口的状态。int getDebugChar()调用read_char()从串口获得一个字节的数据,并且返回它char*getpacket()利用getDebugChar()函数,分析从调试主机传过来的数据包,将调试信息和校验信息区分开来static int read_data_bfr(void)直接从硬件端口读取一个字节的数据,并且返回它 static void write_char(int chr)直接向串口端口写一个字节的数据,45,KGDB分析(2),stub程序的函数接口如下:void set_debug_traps(void)向系统注册调试过程中的处理函数:handle_ex

18、ception()void break_point(void)进入中断,运行中断处理程序 int handle_exception(int exceptionVector,int signo,int err_code,struct pt_regs*linux_regs)在这个函数中一边响应本地主机上的GDB发送过来的控制信号,一边控制远程主机上Linux内核的运行状况,46,内核进入调试状态的路径,内核进入调试状态有两种方法:方法一:通过在内核启动的时候向内核传入参数,这时可以调试系统启动过程内核的运行状况 方法二:在内核完全导入系统正常运行的情况下,通过使用一个gdbstart工具将驱动串口

19、设备,内核的控制权交给本地主机,47,内核进入调试状态方法一,KGDB定义了三个可以向内核传递的参数,用来指定本地主机和远程主机进行连接的方法。这三个参数是:Gdb参数表示在内核启动的时候就需要进行内核的调试 gdbttyS是用来指定本地机器和远程主机需要连接的串口号 gdbbaud是该串口连接的数据传输波特率,48,内核进入调试状态方法一(1),然后,系统进入gdb_hook()函数 调用gdb_serial_setup()函数和注册中断处理函数 运行set_debug_traps()交出控制权,从而进行内核启动过程的调试,49,内核进入调试状态方法一(2),gdb_hook()函数:,50

20、,内核进入调试状态方法二,gdbstart是一个由KGDB提供的工具,源程序放在arch/i386/kernel/gdbstart.c里面 交出控制权的方法和刚才所描述的不同,它是采用ioctl系统调用进入的 对需要连接的串口调用ioctl系统调用,引发初始化串口和进入gdb_hook()函数。运行gdbstart-s speed-t tty-dev命令,就可以和本地的gdb的remote方式连接,从而进入调试过程,Linux 内核调试KDB,KDB 是一个 Linux 系统的内核调试器,它是由 SGI 公司开发的遵循 GPL许可证的开放源码调试工具。,KDB 是一个功能非常强大的 工具,它允许进行几个操作,比如内存和寄存器修改、应用 断点和堆栈跟踪,KDB?,Thanks!,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号