预览加载中,请您耐心等待几秒...
1/4
2/4
3/4
4/4

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

利用GDB进行远程调试在进行嵌入式系统开发中,受到嵌入式系统资源的限制,调试环境和通用桌面系统的调试环境有差别,引入了远程调试技术。这时,调试器运行于通过桌面系统,被调试的程序则运行于基于特定硬件平台的嵌入式系统(目标系统)。因此,要求调试器和被调试程序之间进行通信,调试器还需要能够处理某些特定硬件平台的信息。插桩(stub)方案是在目标系统和调试器内分别加入某些功能模块,二者互通信息来进行调试。而通过引入GDBSERVER这个远程服务程序,正好可以充当目标机上的stub,本地主机上运行我们通常使用的调试器GDB,当时在指定“调试目标”的时候我们不再用file命令指定调试的可执行文件,而是用targetremote命令来指定需要调试的目标机,由它发起对目标机的连接。远程调试示意图: GDB远程调试环境原理图: (用dia做的图,但是怎么边线没有导出来?) 一个远程调试实例(由于我身边没有开发板,只能把主机当目标机来做实验拉。):这里通过搭建一个主机PC端和目标机端的gdbserver来做实验。1、编译宿主机上的GDB调试器如果目标机是arm内核的话,就得用arm-linux-gcc来编译gdb拉,我这里直接就可以用系统已经安装的gdb。2、编译目标机上的stub程序,即编译一个gdbserver(这个stub程序也应该是符合目标机内核体系结构的,如果是arm,也需要用arm-linux-gcc来编译)并下载到目标机上去,我这里直接用已经安装好的gdbserver。3、编写一个简单的用于调试的程序 /*test.c*/#include<stdio.h>intmain(){inti;i=10;printf("i=%d\n",i);return0;}4、编译可运行于目标板的机器代码,并下载到目标机上如果目标板是arm,那么应该这么编译: shell>arm-linux-gcc-g-otesttest.c我这里直接这么编译就可以拉: shell>gcc-g-otesttest.c编译好以后就要下载到目标机上,并且在宿主机上也要保留一份。5、在目标机上运行gdbserver服务 shell>gdbserver127.0.0.1:2345testProcesstestcreated;pid=12655Listeningonport23456、在宿主机上发起连接和调试 shell>gdbtestGNUgdb6.4-debianCopyright2005FreeSoftwareFoundation,Inc.GDBisfreesoftware,coveredbytheGNUGeneralPublicLicense,andyouarewelcometochangeitand/ordistributecopiesofitundercertainconditions.Type"showcopying"toseetheconditions.ThereisabsolutelynowarrantyforGDB.Type"showwarranty"fordetails.ThisGDBwasconfiguredas"i486-linux-gnu"...Usinghostlibthread_dblibrary"/lib/tls/i686/cmov/libthread_db.so.1".(gdb)targetremote127.0.0.1:2345Remotedebuggingusing127.0.0.1:23450xb7f4d790in??()这个时候我们可以看到目标机那边有了出现了下面的信息: Remotedebuggingfromhost127.0.0.1说明连接成功,下面就可以在宿主机上进行调试拉。这个调试和我们平时在桌面系统进行gdb调试是一样的。比如列出源代码信息: (gdb)l1/*test.c*/2#include<stdio.h>34intmain()5{6inti;78i=10;910printf("i=%d\n",i);如果想进行内核调试的话,可以用kgdb。内核调试步骤大概如下:1、在http://kgdb.linsyssoft.com/downloads上下载当前使用内核的kgdbpatch,在主机端安装patch: shell>cd/path/to/kernel/sourceshell>patch-p1-i/path/to/patch/file运行makemenuconfig命令确保kgdb选项中的KERNEL_HACKING被选上,重新编译内核,把新生成的内核镜像zImage复制到开发板。2、在启动开发板上的内核前需要设置:gdbgdbttyS=0gdbbaud=38400。这样系统启动的时候将在创建init内核线程之前听下来,等