嵌入式操作系统实验三GDB

发布时间 : 星期二 文章嵌入式操作系统实验三GDB更新完毕开始阅读

实验收获:

1、实验的内容分成了两部分,显示学会使用了gdb的简单指令调试简单的程序。Gdb的调试方法分成本地调试和目标机调试两部分。编译给定的程序,使用简单的指令如:list、run、continue、kill、quit、break、next、step、print、display、watch等。

2、两个收获,一个是使用虚拟机qemu调试内核(不能在本机重启内核吧,可以想象在虚拟机skyeye平台上运行时,也可以作为目标机进行调试)。一个是gdb的远程调试(即主机和目标机不是同一台机器,要建立连接)。解压编译安装qemu;编译linux内核;编写启动脚本启动qemu,建立连接,开始调试。

具体的知识点收获:

1、

gdb是linux环境下的一款常用的程序调试工具。通过gdb,可以单步跟踪程序的执行流程,有助于程序员更好地理解该程序,并发现其中隐藏的bug。在GDB术语中,有一小段驻留在目标机上的代码被称为“调试桩”(debugging stub),也称为“调试代理”(debugging agent),其责任就是在目标机上实现由主机上的调试器发送过来的调试命令,此外还有向主机调试器报告目标机上发生的异常事件,调试代理与GDB主机之间的通信遵循“GDB远程串行协议(Remote Serial Protocol)”。当然,如果目标机和主机是同一台机器,那么就是属于gdb本地调试,这是基础了。下面,我们以本地调试为例子,来给大家介绍一般的gdb调试过程。

gdb+gdbserver总体介绍

远程调试环境由宿主机GDB和目标机调试stub共同构成,两者通过串口或TCP连接。使用 GDB标准程串行协议协同工作,实现对目标机上的系统内核和上层应用的监控和调试功能。调试stub是嵌入式系统中的一段代码,作为宿主机GDB和目标机调试程序间的一个媒介而存在。

就目前而言,嵌入式Linux系统中,主要有三种远程调试方法,分别适用于不同场合的调试工作:用ROM Monitor调试目标机程序、用KGDB调试系统内核和用gdbserver调试用户空间程序。这三种调试方法的区别主要在于,目标机远程调试stub 的存在形式的不同,而其设计思路和实现方法则是大致相同的。

而我们最常用的是调试应用程序。就是采用gdb+gdbserver的方式进行调试。在很多情况下,用户需要对一个应用程序进行反复调试,特别是复杂的程序。采用GDB方法调试,由于嵌入式系统资源有限性,一般不能直接在目标系统上进行调试,通常采用gdb+gdbserver的方式进行调试。

嵌入式Linux的GDB调试环境由Host和Target两部分组成,Host端使用arm-linux-gdb,Target Board端使用gdbserver。这样,应用程序在嵌入式目标系统上运行,而gdb调试在Host端,所以要采用远程调试(remote)的方法。

调试内核需要一个叫qemu的虚拟机。QEMU是基于GPL协议的开放源代码的虚拟机软件,qemu虚拟机的好处是不用安装庞大的虚拟机系统。并且介于它的低资源占用、免安装、绿色、小巧的特点,我们有理由选择它,当然它不能完全取代VMWARE之类的虚拟机软件。QEMU适用于Linux ,Windows, FreeBSD and MaxOS X这几个平台,对linux的支持比较好。它可以仿真出一个虚拟的CPU,一般的操作系统仿真程序的执行速度都非常慢,但是QEMU的速度居

然可以达到正常的四分之一以上,在仿真程序中算是快的了。

2、

list:列表显示源代码。List 1,18是显示从第1行到第18行代码 list func 查看函数 run:执行当前被调试的程序 ,从头开始执行。 Continue 中断后从断点开始执行 kill:终止正在调试的程序。 quit:终止gdb

break:在代码里设置断点,程序执行到这里时挂起 ,如break 18(b 18) Delete 18 删除18行的断点 Disable 18失能18行的断点 Enable 18使能18行的断点 Info b 显示所有的断点信息

next:执行一行源代码但不进入函数内部。 step:执行一行源代码而且进入函数内部。 Print 打印一次某个变量的值,如print i Display 每次单步执行后都会打印变量的值

watch:监视一个变量的值,每一次监视的值发生变化的时候都会中断并打印。 这些命令都可以用首字母进行简写。 3、-g

只是编译器,在编译的时候,产生调试信息。 总共需要4步

1.预处理,生成.i的文件[预处理器cpp]

2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器gcc] 3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as] 4.连接目标代码,生成可执行程序[链接器ld]

所以支持程序开发的是一整套的GUN工具链,GCC只是调用这一条工具链里不同的工具而已。

GNU Tools是linux环境下最主要的开发 工具集,主要有以下几个部分:

编译开发工具:把源程序编译为可执行文件, 如gcc. 调试工具:对执行程序进行源码或汇编级调试 的软件,如gdb. 软件工程工具:用于协助多人开发或大型软件 项目的管理的软件,如make,cvs等.

1. GCC(GNU Compiler Collection)

支持C,C++,ADA,Object C,Java, Fortran,PASCAL等语言. 主要包括:

cpp:GNU C编译器的预处理器. gcc:符合ISO标准的C编译器. g++:基本符合ISO标准的C++编译器. gcj:GCC的java前端. gnat:GCC的GNU ADA 95的前端. 组件介绍(续) 2. binutils

是一组二进制工具程序集合,是辅助GCC的主 要软件. 主要包括:

as:GNU汇编器 ld:GNU链接器 ar:创建归档文件,向库中添加/提取obj文件 nm:列出obj文件中的符号 objcopy:复制和转化obj文件 组件介绍(续)

2. binutils 主要包括:

objdump:显示对象文件的信息 ranlib:根据归档文件中内容建立索引 readdlf:显示

elf格式执行文件中的各种信息 size:显示object文件和执行文件各段的总大小 strings:显示文件中可以打印的字符 strip:去掉执行文件中多余的信息(如调试信息) gprof:用来显示图表档案数据 组件介绍(续)

3. gdb:GNU调试器.可以用来调试C, C++和其他语言编写的程序.如加一些图 形前端(如DDD),可以在图形环境下调 试程序.

4. GNU make:是一个用来控制可执行程序生成过程,从其他源码文件中生成可执行程 序的程序.它允许用户生成和安装软件包, 而无需了解生成,安装软件包的过程. 组件介绍(续)

5. diff/diff3/sidff:比较文本差异的工 具,也可以用来生成补丁.

6. patch:补丁安装程序,可根据diff生成的 补丁来更新程序 7. CVS:版本控制系统.用于管理发行版本 和控制在多位作者间同时编辑源码文件.

安装交叉编译环境,就是对GCC、GBD、make、ld、as的安装,即对gcc、binutils、库的安装(如果只需要交叉编译内核,binutils和gcc就足够了,、如果需要交叉编译应用程序,那就还要再编译一份 glibc,而gbd等其他工具都不是必需的)。对交叉编译环境,有手动、脚本安装、直接获取二进制源码的方式。

一、实验步骤

一、基础实验

(1) 编译调试程序

$gcc –g test.c –o test

(2) List命令

(gdb) list line1,line2

list func

list 1,18

联系合同范文客服:xxxxx#qq.com(#替换为@)