嵌入式调试与优化技术论文.docx_第1页
嵌入式调试与优化技术论文.docx_第2页
嵌入式调试与优化技术论文.docx_第3页
嵌入式调试与优化技术论文.docx_第4页
嵌入式调试与优化技术论文.docx_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

南 阳 理 工 学 院嵌入式调试与优化技术学院(部): 软件学院 _ 专 业: 软件工程 _ _学 号: 1215135242 _班 级: 12级移动(4)班 学 生: 彭文鑫 _指导老师: _ 许_豪 _完成日期: _ 2014年6月7日 _目录 1.在LINUX上的CDB1.1 GDB的功能简述1.2 GDB运用所 1.3 GDB调试的实 2.进程间的通信 2.1进间信的概 2.2管道2.3 消息队列2.4信号量2.5共享内存 2.6信号 致谢嵌入式调试与优化技术摘要在过去的几十年里,嵌入式工程师在开发和调试中已经越来越依赖于跟踪缓存的帮助。但随着100MHz频率以上的高速RISC处理器的普及,片内Cache、RAM和FLASH存储器逐渐变得越来越普遍。越来越多的处理器总线活动将无法在外部管脚上观测。这样,传统的收集跟踪信息的方法就不再可行了。在过去的几年里,通过微处理器生产厂商和开发工具厂商之间的密切合作,开发出了各种基于跟踪缓存调试方法的新技术。这些技术通常的做法是使仿真器通过特殊的跟踪端口只捕获与跟踪有关的信息,通常这个跟踪端口是处理器提供的一个标准窄位宽处理器接口(只需要少量的管脚数目)。这些与跟踪有关的信息只要包含让仿真器判定代码执行流程的信息就足够了。许多情况下,数据读写活动也包含在其中。掌握了这些可以判定代码执行流程的信息后,不需要收集处理器总线活动的全部信息,仿真器就可以再现处理器执行的复杂历史记录。这种跟踪方法,相对于在线仿真器,一般称之为在线调试器。关键词GDB调试;进程;内存优化1在LINUX上的CDB调试1.1GDB的功能简述 GDB 是一个强大的命令行调试工具。大家知道命令行的强大就是在于,其可以形成执行序列,形成脚本。UNIX 下的软件全是命令行的,这给程序开发提供了极大的便利,命令行软件的优势在于,他们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可以做出一个非常强大的功能。于是 UNIX 下的软件比 windows 下的软件更能有机的结合,各自发挥各自的长处,组合成更为强筋的功能。而 windows 下的图形软件基本上各自为营,互相不能条用,很不利于各种软件的相互集成。在这里并不是要和 windows 做个什么比较,所谓“寸有所长,尺有所短”,图形化工具还是有不如命令行的地方。用 GDB 调试程序GDB 概述GDB 是 GNU 开源组织发布的一个强大的 UNIX 下调试程序工具。或许各位比较喜欢那种图形界面方式的,像 VC,BCB 等 IDE 的调试,但如果你是在 UNIX 平台下作软件,你会发现 GDB 这个调试工具有比 VC,BCB 的图形化调试器更强大的功能。1.2 GDB运用所需的常用命令1、常看源码:list(l)行号当前行号的正偏移当前行号的负偏移:哪个文件的哪一行函数名:文件的哪个函数程序运行时语句在内存中的地址2、设置断点:break(b)n指定函数断点指定行号断点当前行号的正负偏移:哪个文件的哪一行运行中的内存地址不带参数,下一条指令停止处 .在运行中,当条件满足时停止。Eg.breakifi=100 /当i=100时,立即停止break foo if i=100 /断点设置在foo中,断点条件是i-100, 一点在函数foo中,i的值等于100,被停止。 3、查看信息:infoinfobreak查看断点信息 info locals 打印出当前函数中所有局部变量及其值infostack查看栈中信息 info frame 更详细的栈层地址信息infoargs查看参数信息inforegisters/infoall -registers查看(所有)寄存器信息infosources查看项目的源代码信息4、维护breakpoint:disable/enable/clear/delete disable(dis) 【breakpoints】 【range.】 如果没有参数,则停止所有的断点, enable 【breakpoints】【range】 clear / 清楚已定义的停止点 delete breakpoints ranga. 删除指定的断点5、恢复程序运行:continue(c)6、until和finish until 跳出循环比较有用 help finish Execute until selected stack frame returns. Upon return, the value returned is printed and put in the value history. finish 用来跳出函数比较有用。 help until Execute until the program reaches a source line greater than the current or a specified location (same args as break command) within the current frame1.3GDB调试的实例叙述1: 对于在应用程序中加入参数进行调试的方法:直接用 gdb app -p1 -p2 这样进行调试是不行的。需要像以下这样使用: #gdb app (gdb) r -p1 -p2 或者在运行run命令前使用set args命令: (gdb) set args p1 p2 可以用show args 命令来查看2. 加入断点: break break break +offsetbreak -offset (在当前行号的前面或后面的offset行停住。)break filename:linenum 在源文件filename的linenum行处停住。 break filename:function 在源文件filename的function函数的入口处停住。 break . if .可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环境体中,可以设置 break if i=100,表示当i为100时停住程序。3. 查看运行时的堆栈: 使用bt命令4. 打印某个变量的值: print val5. 单步: n 继续运行:cstep单步跟踪,如果有函数调用,他会进入该函数。next同样单步跟踪,如果有函数调用,他不会进入该函数。很像VC等工具中的step over。后面可以加count也可以不加,不加表示一条条地执行,加表示执行后面的count条指令,然后再停住。set step-modeset step-mode on打开step-mode模式,于是,在进行单步跟踪时,程序不会因为没有debug信息而不停住。这个参数有很利于查看机器码。set step-mod off关闭step-mode模式。finish运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息。until 或 u当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。 6.在中执行shell命令:在gdb环境中,你可以执行UNIX的shell的命令,使用gdb的shell命令来完成:eg. shell make 7. 运行环境 可设定程序的运行路径。 show paths 查看程序的运行路径。 set environment varname =value 设置环境变量。如:set env USER=hchen show environment varname 查看环境变量。8.观察点(WatchPoint) 观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程 序。我们有下面的几种方法来设置观察点: watch 为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。 rwatch 当表达式(变量)expr被读时,停住程序。 awatch 当表达式(变量)的值被读或被写时,停住程序。 info watchpoints 列出当前所设置了的所有观察点。9. 维护breakpoint clear 清除所有的已定义的停止点。 clear func 清除所有设置在函数上的停止点。 delete breakpoints range. 删除指定的断点,breakpoints为断点号。如果不指定断点号,则表示删除所有的断点。range 表示断点号的范围(如:3-7)。其简写命令为d。 比删除更好的一种方法是disable停止点,disable了的停止点,GDB不会删除,当你还需要时,enable即可,就好像回收站一样。 disable breakpoints range. disable所指定的停止点,breakpoints为停止点号。如果什么都不指定,表示disable所有的停止 点。简写命令是dis. enable breakpoints range. enable所指定的停止点,breakpoints为停止点号。10、程序变量查看文件中某变量的值:file:variablefunction:variable可以通过这种形式指定你所想查看的变量,是哪个文件中的或是哪个函数中的。例如,查看文件f2.c中的全局变量x的值:gdb) p f2.c:x查看数组的值有时候,你需要查看一段连续的内存空间的值。比如数组的一段,或是动态分配的数据的大小。你可以使用GDB的“”操作符,“”的左边是第一个内存的地址的值,“”的右边则你你想查看内存的长度。例如,你的程序中有这样的语句:int *array = (int *) malloc (len * sizeof (int);于是,在GDB调试过程中,你可以以如下命令显示出这个动态数组的取值:p *arraylen如果是静态数组的话,可以直接用print数组名,就可以显示数组中所有数据的内容了。11.输出格式一般来说,GDB会根据变量的类型输出变量的值。但你也可以自定义GDB的输出的格式。例如,你想输出一个整数的十六进制,或是二进制来查看这个整型变量的中的位的情况。要做到这样,你可以使用GDB的数据显示格式:x 按十六进制格式显示变量。d 按十进制格式显示变量。u 按十六进制格式显示无符号整型。o 按八进制格式显示变量。t 按二进制格式显示变量。a 按十六进制格式显示变量。c 按字符格式显示变量。f 按浮点数格式显示变量。(gdb) p i$21 = 101(gdb) p/a i$22 = 0x65(gdb) p/c i$23 = 101 e(gdb) p/f i$24 = 1.41531145e-43(gdb) p/x i$25 = 0x65(gdb) p/t i$26 = 11001012.进程间的通信2.1进程间通信的概述进程间的通信,它的数据空间的独立性决定了它的通信相对比较复杂,需要通过操作系统。以前进程间的通信只能是单机版的,现在操作系统都继承了基于套接字(socket)的进程间的通信机制。这样进程间的通信就不局限于单台计算机了,实现了网络通信。进程的通信机制主要有:管道、有名管道、消息队列、信号量、共享空间、信号、套接字。 2.2管道它传递数据是单向性的,只能从一方流向另一方,也就是一种半双工的通信方式;只用于有亲缘关系的进程间的通信,亲缘关系也就是父子进程或兄弟进程;没有名字并且大小受限,传输的是无格式的流,所以两进程通信时必须约定好数据通信的格式。管道它就像一个特殊的文件,但这个文件之存在于内存中,在创建管道时,系统为管道分配了一个页面作为数据缓冲区,进程对这个数据缓冲区进行读写,以此来完成通信。其中一个进程只能读一个只能写,所以叫半双工通信,为什么一个只能读一个只能写呢?因为写进程是在缓冲区的末尾写入,读进程是在缓冲区的头部读取,他们各自 的数据结构不同,所以功能不同。2.3消息队列消息队列是存放在内核中的消息链表,每个消息队列由消息队列标识符标识,于管道不同的是,消息队列存放在内核中,只有在内核重启时才能删除一个消息队列,内核重启也就是系统重启,同样消息队列的大小也是受限制的。 2.4信号量信号量也可以说是一个计数器,常用来处理进程或线程同步的问题,特别是对临界资源的访问同步问题。临界资源:为某一时刻只能由一个进程或线程操作的资源,当信号量的值大于或等于0时,表示可以供并发进程访问的临界资源数,当小于0时,表示正在等待使用临界资源的进程数。更重要的是,信号量的值仅能由PV操作来改变。 2.5共享内存共享内存就是分配一块能被其他进程访问的内存。共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。首先说下在使用共享内存区前,必须通过系统函数将其附加到进程的地址空间或说为映射到进程空间。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到 进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互 斥锁和信号量都可以。采用共享内存通信的一个显而易 见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的

温馨提示

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

最新文档

评论

0/150

提交评论