第7章 嵌入式系统的调试_第1页
第7章 嵌入式系统的调试_第2页
第7章 嵌入式系统的调试_第3页
第7章 嵌入式系统的调试_第4页
第7章 嵌入式系统的调试_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1嵌入式系统的调试 陈文智 浙江大学计算机学院2012年11月浙江大学2提纲l1. 远程调试环境的搭建原理 l2. 使用GDB l3. Linux内核调试l4. 实验 l实验一:利用GDB进行本地调试 l实验二:利用GDB进行远程调试 l实验三:arm-linux内核调试 31. 远程调试环境的搭建原理 l通用的桌面操作系统与嵌入式操作系统在调试环境上存在明显的差别l远程调试,调试器运行于通用桌面操作系统的应用程序,被调试的程序则运行于基于特定硬件平台的嵌入式操作系统(目标操作系统) 4l远程调试带来以下问题:l调试器与被调试程序如何通信 l被调试程序产生异常如何及时通知调试器 l调试器如何控

2、制、访问被调试程序 l调试器如何识别有关被调试程序的多任务信息并控制某一特定任务 l调试器如何处理某些与目标硬件平台相关的信息 51.1 插桩(stub) lStub方案是在目标操作系统和调试器内分别加入某些功能模块,二者互通信息来进行调试l这一方案需要目标操作系统提供支持远程调试协议的通信模块和多任务调试接口,并改写异常处理的有关部分 l目标操作系统还需要定义一个设置断点的函数 6l远程调试示意图 :71.2 GDB介绍 lGDB是GNU C自带的调试工具,使用GDB可以完成下面这些任务:l运行程序,可以给程序加上所需的调试任何条件l在给定的条件下让程序停止l检查程序停止时的运行状态l通过改

3、变一些数据,可以更快地改正程序的错误 81.3 GDB远程调试功能介绍 l如果需要调试的程序和GDB所运行的环境不同,或者说需要调试的环境上根本无法运行起GDB,就需要使用远程调试功能 l指定需要调试的远程机器的方法是使用target remote命令 l在远程机器上,需要实现一个stub文件,在这个文件里面提供串口连接的协议,和传送数据信息的方法 9lGDB远程调试环境原理图:本地主机Xwindow环境GDB/XGDB远程主机Stub程序内核应用程序串口或TCP/IP连接102. 使用GDB l2.1 GDB命令l补齐功能 l键入gdb gdb_test命令来启动GDB并载入程序 gdb_t

4、est,命令行进入了GDB模式。 $ gdb gdb_test(gdb)11lGDB中的常用命令如下:指令解释file载入程序。如file hello。当然,程序的路径名要正确。quit退出GDB。也可以输入C-d来退出GDB。run执行载入后的要调试的程序。可以输入参数。info查看程序的信息。多用来查看断点信息。可以用help info来查看具体帮助。info sourc查看当前文件的名字,路径,所使用的程序语言等信息。info stack 查看调用栈。info local 查看局部变量信息。info br br是断点break的缩写,用这条指令,可以得到所设置的所有断点的详细信息。lis

5、tlist FUNCTION列出被调试程序某个函数list LINENUM以当前源文件的某行为中间显示一段源程序list 接着前一次继续显示list - 显示前一次之前的源程序list FILENAME:FUNCTION显示另一个文件的一段程序,12break最常用和最重要的命令:设置断点。break FUNCTION在函数入口设置断点break LINENUM在当前源文件的某一行上设置断点break FILENAME:LINENUM在另一个源文件的某一行上设置断点break *ADDRESS在某个地址上设置断点watch监视某个表达式或变量,当它被读或被写时让程序断下。格式如下:watch

6、EXPRESSION set修改变量值。格式如下:set varible=valuestep单步执行,进入遇到的函数。next单步执行,不进入函数调用,即视函数调用为普通语句。continue恢复中断的程序执行。help通过下面的方法获得帮助,下例为获得list指令。help list132.2 断点与条件断点 lGDB中的断点有四种状态: l有效(Enabled)l禁止(Disabled)l一次有效(Enabled once)l有效后删除(Enabled for deletion)l条件断点的设置语句: (gdb) break .if COND143. Linux内核调试 l需要在Linux

7、内核里面做一些修改,并且提供一个stub文件 l把stub,串口驱动程序和Linux内核编译连接在一起 l利用这个核心启动的系统,在需要进行调试的时候,激活程序的断点,等待本地主机的连接l然后,就可以进行内核的调试了 153.1 内核调试技术 l调试内核代码的时候,则可以用 printk()显示监视信息 lprintk()可以指定一个记录级别,在头文件 中定义了 8 种可用的日志级别字符串 :lKERN_EMERG 用于紧急事件消息,它们一般是系统崩溃之前提示的消息。 lKERN_ALERT 用于需要立即采取动作的情况。 16lKERN_CRIT 临界状态,通常涉及严重的硬件或软件操作失败。l

8、KERN_ERR 用于报告错误状态;设备驱动多用此级来报告来自硬件的问题。 lKERN_WARNING 警告可能出现问题,这类情况通常不会对系统造成严重问题。 lKERN_NOTICE 正常情形的提示。许多与安全相关的状况用这个级别进行汇报。 lKERN_INFO 提示性信息。很多设备驱动启动时,用此级别打印相应的硬件信息。 lKERN_DEBUG 用于调试信息。173.1 内核调试技术(1)l在标准的Linux系统上,用户空间的守护进程klogd从记录缓冲区中获取内核消息 ,通过syslogd守护进程将他们保存在系统日志文件中 l根据日志级别,内核可能会把消息打印到当前控制台上 l内核在遇到

9、运行错误时,会显示发生错误时处理器的状态 183.1 内核调试技术(2)l大部分错误都是由于 NULL指针的使用或其他不正确的指针值的使用,这些错误通常会导致一个 oops 消息loops消息给开发者许多信息,但是往往这些原始信息都是一些十六进制的内存地址,有两个工具可用来将其解析为符号:lklogd lksymoops 193.2 KGDB分析 lKGDB适用于两种情况下的调试:l开发者需要调试内核l开发者需要调试驱动模块l使用KGDB进行内核调试的步骤如下:l下载当前使用内核的kgdb patch l在PC主机端安装patchl运行make menuconfig命令,确保kgdb选项中的K

10、ERNEL_HACKING被选上 20l重新编译内核。l把新生成的内核镜像zImage拷贝到开发板。l在启动开发板上的内核前需要设置:gdb gdbttyS=0 gdbbaud=38400。l在PC主机端,使用命令 cd /path/to/kernel/source gdb vmlinuxgdb: set remotebaud 38400 gdb: target remote /dev/ttyS0213.2 KGDB分析(1)l串口驱动程序模块和数据包传送函数用来初始化串口,定义在drivers/char/serial.c中,部分声明如下:lstruct serial_state* gdb_s

11、erial_setup(int ttyS, int baud) 参数ttyS为串口号,baud为传输波特率。函数返回该串口的状态。lint getDebugChar() 调用read_char()从串口获得一个字节的数据,并且返回它lchar* getpacket() 利用getDebugChar()函数,分析从调试主机传过来的数据包,将调试信息和校验信息区分开来lstatic int read_data_bfr(void) 直接从硬件端口读取一个字节的数据,并且返回它 lstatic void write_char(int chr) 直接向串口端口写一个字节的数据 223.2 KGDB分析(

12、2)lstub程序的函数接口如下: lvoid set_debug_traps(void)向系统注册调试过程中的处理函数:handle_exception() lvoid break_point(void)进入中断,运行中断处理程序 lint handle_exception(int exceptionVector, int signo, int err_code, struct pt_regs* linux_regs)在这个函数中一边响应本地主机上的GDB发送过来的控制信号,一边控制远程主机上Linux内核的运行状况 233.3 内核进入调试状态的路径 l内核进入调试状态有两种方法 :l方法

13、一:通过在内核启动的时候向内核传入参数,这时可以调试系统启动过程内核的运行状况 l方法二:在内核完全导入系统正常运行的情况下,通过使用一个gdbstart工具将驱动串口设备,内核的控制权交给本地主机 243.3 内核进入调试状态方法一lKGDB定义了三个可以向内核传递的参数,用来指定本地主机和远程主机进行连接的方法。这三个参数是:lGdb参数表示在内核启动的时候就需要进行内核的调试 lgdbttyS是用来指定本地机器和远程主机需要连接的串口号 lgdbbaud是该串口连接的数据传输波特率 253.3 内核进入调试状态方法一(1)l然后,系统进入gdb_hook()函数 l调用gdb_seria

14、l_setup()函数和注册中断处理函数 l运行set_debug_traps()交出控制权,从而进行内核启动过程的调试 263.3 内核进入调试状态方法一(2)lgdb_hook()函数: int gdb_hook(void)if(ser = gdb_serial_setup(gdb_ttyS, gdb_baud) = 0) if (ser-info != NULL) gdb_serial_setup(gdb_ttyS, gdb_baud) ; set_debug_traps() ; printk(Waiting for connection from remote gdb. ) ; bre

15、akpoint() ; gdb_null() ; printk(Connected.n); return(0) ; /* gdb_hook_interrupt2 */273.3 内核进入调试状态方法二lgdbstart是一个由KGDB提供的工具,源程序放在arch/i386/kernel/gdbstart.c里面 l交出控制权的方法和刚才所描述的不同,它是采用ioctl系统调用进入的 l对需要连接的串口调用ioctl系统调用,引发初始化串口和进入gdb_hook()函数。 l运行gdbstart -s speed -t tty-dev命令,就可以和本地的gdb的remote方式连接,从而进入调

16、试过程 284. 实验 l实验一 利用GDB进行本地调试 l实验二 利用GDB进行远程调试 l实验三 am-linux内核调试 29实验一 利用GDB进行本地调试l在编译时用-g开关,如:gcc -g -o bubble bubble.c linfo source,可以获得程序名,目录,文件大小,语言等信息。l可以用info br,察看设置的断点信息 l键入 run执行程序 30实验二 利用GDB进行远程调试 l首先编译宿主机上的GDB调试器 :l解压gdb-5.3.tar.gz l运行./configure -target=arm-linux -prefix=/usr/local/arm-g

17、db v创建 make 文件,执行make,make install larm-linux-gdb将生成在 /usr/local/arm-gdb/bin 31实验二 利用GDB进行远程调试(1)l接着编译目标机上的stub程序 :l首先进入GDB目录编译,执行export PATH=$PATH:/usr/local/arm-gdb/bin,然后执行./configure -target=arm-linux -host=arm-linux l在gdbserver目录,键入make CC = /usr/local/xsbase-arm-linux-R1/bin/arm-linux-gcc编译用于目

18、标机的stub程序 l如果没有编译错误gdbserver将生成在gdb/gdbserver目录下 32实验二 利用GDB进行远程调试(2)l然后,建立宿主机和目标板之间的TCP/IP连接 l默认XSBase 的IP地址是192.168.100.50。在这里,假设主机平台的 IP是192.168.100.216 l换用arm-linux-gcc编译bubble.c文件 ,执行arm-linux-gcc -g bubble.c -o testl下载test和gdbserver到XSBase目标板 33实验二 利用GDB进行远程调试(3)l下面演示如何建立gdb和gdbserver的连接l在XSBa

19、se255目标板上运行gdbserver l拷贝test程序到主机平台上的/usr/local/arm-gdb/bin目录下,然后执行arm-linux-gdb。rootHYPER255 /root$ ./gdbserver 192.168.100.216:1234 testProcess test created; pid = 85Listening on port 123434l连接到xsbase开发板 l如果连接成功的话,在XSBase255上将出现下面的信息 (gdb) target remote 192.168.100.50:1234Remote debugging using 192.168.100.50:12340 x40002980Remote debugging from host 192.168.100.21635实验三

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论