再议:嵌入式中自己编译gdb和gdbserver工具

[复制链接]
 楼主| db10 发表于 2009-5-27 12:13 | 显示全部楼层 |阅读模式
记得以前写过:“嵌入式中自己编译gdb和gdbserver工具”的帖子。<br />经过使用,发现一些由于开发环境的不同,编译的时候会出现一些问题,这个帖子是针对vmware+red&nbsp;hat9.0上编译通过,能跑的,经过实际9200,9261都是能用的,当然再9260没有试,身边没有可试的板子。<br />&nbsp;发现在现在比较热的ubuntu下,编译时通不过。这都是自己尝试后看到的现象。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;嵌入式中自己编译gdb和gdbserver工具<br /><br />目&nbsp;录<br /><br /><br /><br />一.序论&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2<br />二.开发环境说明&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2<br />三.编译gdb和gdbserver工具&nbsp;&nbsp;&nbsp;&nbsp;2<br />四.Gdbserver操作使用&nbsp;&nbsp;&nbsp;&nbsp;5<br /><br /><br /><br />一.序论<br />就目前而言,嵌入式Linux系统中,主要有三种远程调试方法,分别适用于不同场合的调试工作:<br />用ROMMonitor调试目标机程序、<br />用KGDB调试系统内核<br />用gdbserver调试用户空间程序。<br /><br />&nbsp;&nbsp;这三种调试方法的区别主要在于,目标机远程调试stub的存在形式的不同,而其设计思路和实现方法则是大致相同的。<br />而我们最常用的是调试应用程序。就是采用gdb+gdbserver的方式进行调试。在很多情况下,用户需要对一个应用程序进行反复调试,特别是复杂的程序。采用GDB方法调试,由于嵌入式系统资源有限性,一般不能直接在目标系统上进行调试,通常采用gdb+gdbserver的方式进行调试。Gdbserver在目标系统中运行,gdb则在宿主机上运行。<br /><br />目标系统必须包括gdbserver程序,宿主机也必须安装gdb程序。一般linux发行版中都有一个可以运行的gdb,但开发人员不能直接使用该发行版中的gdb来做远程调试,而要获取gdb的源代码包,针对arm平台作一个简单配置<br />二.开发环境说明<br />嵌入式中自己编译gdb和gdbserver工具,由自己亲自编译通过并可以正确运行使用。所在环境是pc运行在red&nbsp;9.0.硬件板子:at91rm9200,跑嵌入式linux-2.4.27.gcc为3.3.2,gdb和gdbservr源代码选用gdb-5.2.1(先后试过gdb6.0,&nbsp;gdb6.4,&nbsp;gdb6.6三个版本,这三个没有成功,具体以后有时间再研究),可以到ftp://ftp.gnu.org/gnu/gdb下载。.<br /><br />三.编译gdb和gdbserver工具<br />&nbsp;&nbsp;&nbsp;可以在根据下面一步一步做,也可以象我一样,做一个shell脚本文件,这样可以提高效率(可以在windows上先做好这个脚本,制作好后拷贝到pc的linux下,可能不能执行,要用:先执行dos2unix&nbsp;脚本名&nbsp;将dos格式转化成linux认识的文件,然后再执行chmod&nbsp;777&nbsp;脚本名。这样就可以直接执行这个脚本了)。<br />操作具体情况请看脚本里的注释,编译中,源代码中好像没有出现语法错误提示,如果有的话,也就是添加或取消包含.H文件。<br />#!/bin/sh<br />#编译gdb&nbsp;<br />#download&nbsp;from&nbsp;http://cygwin.mirrors.pair.com/gdb/old-releases/<br />#&nbsp;tar&nbsp;-xjvf&nbsp;gdb-5.2.1.tar.bz2&nbsp;<br />#文件的很多目录也许你还没有建立,跟我的电脑上不一致,则要自己建立起目录。<br />cd&nbsp;/usr/src/arm/gdb/gdb-5.2.1&nbsp;<br />mkdir&nbsp;../build-gdb&nbsp;<br />cd&nbsp;&nbsp;../build-gdb<br />../gdb-5.2.1/configure&nbsp;--target=arm-linux&nbsp;--enable-shared&nbsp;--prefix=/usr/src/arm/gdb/build-gdb&nbsp;--without-x&nbsp;--disable-gdbtk&nbsp;--disable-tui&nbsp;--without-included-regex&nbsp;--without-included-gettext&nbsp;<br />#具体说明请看相关附录<br />make&nbsp;<br />make&nbsp;install&nbsp;<br />#export&nbsp;PATH=$PATH:&nbsp;/usr/src/arm/gdb/build-gdb/bin<br /><br />#编译gdbserver&nbsp;gdb5.2.1版本<br />mkdir&nbsp;../build-gdbserver&nbsp;<br />cd&nbsp;../build-gdbserver&nbsp;<br />chmod&nbsp;+x&nbsp;../gdb-5.2.1/gdb/gdbserver/configure&nbsp;<br />CC=/usr/local/arm/3.3.2/bin/arm-linux-gcc&nbsp;../gdb-5.2.1/gdb/gdbserver/configure&nbsp;arm-linux&nbsp;--without-included-regex&nbsp;--without-included-gettext&nbsp;<br />#具体说明请看相关附录&nbsp;<br />make&nbsp;<br />cp&nbsp;-vf&nbsp;gdbreplay&nbsp;gdbserver&nbsp;&nbsp;/nfsshare/gdb<br /><br />注释:1.编译完主机上的gdb后,在我的电脑linux下:/usr/src/arm/gdb//build-gdb/bin&nbsp;生成可执行的arm-linux-gdb和arm-linux-run(这个具体不知道干吗的)文件。<br />2.编译完在板子上跑的gdbserver后,在我的电脑linux下:/usr/src/arm/gdb/build-dbserver&nbsp;生成板子上可执行的gdbreplay和gdbserver&nbsp;(这个具体不知道干吗的)文件。<br />上面:target是你的目标板,我的是arm-linux,prefix是你要安装的目标文件夹<br /><br />具体说明附录:对应脚本里的两行编译配置:../gdb-5.2.1/configure&nbsp;--target=arm-linux&nbsp;--enable-shared&nbsp;--prefix=/usr/src/arm/gdb/build-gdb&nbsp;--without-x&nbsp;--disable-gdbtk&nbsp;--disable-tui&nbsp;--without-included-regex&nbsp;--without-included-gettext&nbsp;<br />还有:<br />CC=/usr/local/arm/3.3.2/bin/arm-linux-gcc&nbsp;../gdb-5.2.1/gdb/gdbserver/configure&nbsp;arm-linux&nbsp;--without-included-regex&nbsp;--without-included-gettext&nbsp;<br />上面两个配置,在我电脑如果书写成用\隔开的几行,这样不能运行,不知道为什么。我一直还没有搞明白,不过这是小问题。<br />上面的配置一定要加对,否则编译有问题,或者编译好后,使用时有问题,如运行不起来,或者运行时不能设置断点,只能全速跑。<br /><br />整个编译过程如果碰到这些问题:<br />1.编译后,在板子上运行gdbserver后出现<br />[root@AT91RM9200DK&nbsp;/usr]$gdbserver:&nbsp;error&nbsp;in&nbsp;loading&nbsp;shared&nbsp;libraries:&nbsp;libthread<br />_db.so.1:&nbsp;cannot&nbsp;open&nbsp;shared&nbsp;object&nbsp;file:&nbsp;No&nbsp;such&nbsp;file&nbsp;or&nbsp;directory<br />出现这个问题,是跟上面的两个配置有关,如只是简单的配置了如网上流行的说法target&nbsp;host&nbsp;prefix,没有其他选项了。这样生成的gdbserver是要共享库的,目标文件在使用时要求有libthread_db.so.1共享库文件,可以尝试将gcc3.3.2(我自己使用的版本)交叉编译器下的这个文件拷贝到你的板子linux&nbsp;下的/lib&nbsp;或&nbsp;/tm/lib,或/usr/lib(具体不是很明白,我试过拷贝在/lib),但是有这个文件后,会导致这个文件要调用libc.so.6这个文件,这个文件又需要libc-2.3.2.so&nbsp;,这些文件更换后,最后更多文件依赖。原因是:我的根文件下面ramdisk解开后库文件的版本低,好像全是1.3.2版本的(在家没带板子),就是说libc-2.3.2.so,ld-2.3.2.so,还很多别的库文件都是1.0版本的。其实这些库只是版本低,在原来的ramdisk里都有,但是提示找不到。你上一步我也是跟综过的。<br />然而我用新的如gcc&nbsp;3.3.2或3.4.1里面的库换掉后换掉后,如换成libc-2.3.2.so,ld-2.3.2.so,连根文件ramdisk启动不来,也就是说要改动init部分,也就意外重新做busybox部分,那工作量更大,然而我也做了busybox,发现新做的busybox做成ramdisk后,内核起不来,处在init过不去。<br />&nbsp;所以如果文件版本不一致的话,busybox和ramdisk不是自己作的话,上面这种动态编译gdbserver然后再在板子上加共享库,那是很难成功的。<br />&nbsp;&nbsp;上面这个原因,我没有搞定,如果有人知道原因,请提示我。谢谢!<br />2.为了解决问题,看了一篇老外的**,说可以在编译gdbserver时,改动gdbserver下面的Makefie.in或configure后的Makefile,里面的LDFLAGS改成&nbsp;LDFLAGS=&nbsp;-static。<br />原始老外**:<br />[bgat@mars&nbsp;build-gdb]&nbsp;cd&nbsp;gdb/gdbserver<br />[bgat@mars&nbsp;build-gdb]&nbsp;make&nbsp;CC=arm-linux-gcc<br />[bgat@mars&nbsp;build-gdb]&nbsp;file&nbsp;gdbserver<br />./gdbserver:&nbsp;ELF&nbsp;32-bit&nbsp;LSB&nbsp;executable,&nbsp;ARM,&nbsp;version&nbsp;1&nbsp;(ARM),&nbsp;dynamically&nbsp;linked&nbsp;(uses&nbsp;shared&nbsp;libs),&nbsp;not&nbsp;stripped<br />You&nbsp;probably&nbsp;don't&nbsp;want&nbsp;your&nbsp;gdbserver&nbsp;to&nbsp;use&nbsp;shared&nbsp;libraries,&nbsp;unless&nbsp;your&nbsp;target&nbsp;environment&nbsp;supports&nbsp;them&nbsp;(and&nbsp;you&nbsp;want&nbsp;to&nbsp;prove&nbsp;that&nbsp;they&nbsp;actually&nbsp;work!).&nbsp;To&nbsp;save&nbsp;some&nbsp;hair,&nbsp;you'll&nbsp;probably&nbsp;want&nbsp;to&nbsp;build&nbsp;a&nbsp;statically-linked&nbsp;gdbserver&nbsp;instead,&nbsp;so&nbsp;that&nbsp;you&nbsp;can&nbsp;debug&nbsp;even&nbsp;if&nbsp;shared&nbsp;libraries&nbsp;are&nbsp;broken.&nbsp;To&nbsp;do&nbsp;that,&nbsp;edit&nbsp;the&nbsp;Makefile&nbsp;in&nbsp;gdb/gdbserver,&nbsp;and&nbsp;modify&nbsp;LDFLAGS:&nbsp;<br /><br /><br />LDFLAGS&nbsp;=&nbsp;-static<br />There&nbsp;may&nbsp;be&nbsp;other&nbsp;LDFLAGS&nbsp;flags&nbsp;already&nbsp;there,&nbsp;which&nbsp;you'll&nbsp;want&nbsp;to&nbsp;leave&nbsp;alone---&nbsp;just&nbsp;add&nbsp;-static&nbsp;to&nbsp;the&nbsp;end&nbsp;of&nbsp;the&nbsp;list.&nbsp;In&nbsp;other&nbsp;cases,&nbsp;LDFLAGS&nbsp;may&nbsp;not&nbsp;exist&nbsp;at&nbsp;all;&nbsp;just&nbsp;add&nbsp;the&nbsp;above&nbsp;line&nbsp;somewhere&nbsp;near&nbsp;CFLAGS.&nbsp;<br /><br />Then,&nbsp;rebuild&nbsp;gdbserver:&nbsp;<br /><br /><br />[bgat@mars&nbsp;build-gdb]&nbsp;make&nbsp;clean<br />[bgat@mars&nbsp;build-gdb]&nbsp;make&nbsp;CC=arm-linux-gcc<br />[bgat@mars&nbsp;build-gdb]&nbsp;file&nbsp;gdbserver<br />gdbserver:&nbsp;ELF&nbsp;32-bit&nbsp;LSB&nbsp;executable,&nbsp;ARM,&nbsp;version&nbsp;1&nbsp;(ARM),&nbsp;statically&nbsp;linked,&nbsp;not&nbsp;stripped<br />Run&nbsp;arm-linux-strip&nbsp;on&nbsp;the&nbsp;executable,&nbsp;if&nbsp;you&nbsp;want&nbsp;to&nbsp;shrink&nbsp;it&nbsp;down:&nbsp;<br /><br /><br />[bgat@mars&nbsp;build-gdb]&nbsp;arm-linux-strip&nbsp;gdbserver<br />[bgat@mars&nbsp;build-gdb]&nbsp;ls&nbsp;-l&nbsp;gdbserver<br />-rwxrwxr-x&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;bgat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bgat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;249164&nbsp;Aug&nbsp;&nbsp;2&nbsp;11:16&nbsp;gdbserver<br /><br />我这样编译gdbserver后,gdbserver终于可以运行了,但是让我失望的是,gdbserver调试时程序不能设置断点,跑一次就完了。提示:<br />warnning&nbsp;<br />Cannot&nbsp;insert&nbsp;breakpoint&nbsp;1.<br />&nbsp;&nbsp;Error&nbsp;accessing&nbsp;memory&nbsp;address&nbsp;0x8...<br />&nbsp;上面这个原因,我没有搞定,如果有人知道原因,请提示我。谢谢!<br />3.尝试了快1个星期后,很多版本的gdb尝试过。最后就是使用了第三条说的方法编译的,通过了,gdbserver可以跑了,可以设置断点了,现在正常。<br /><br />四.Gdbserver操作使用<br />&nbsp;&nbsp;有关gdb和gdbserver调试操作使用说明,资料一大把,这里讲讲要注意的地方:<br />1.&nbsp;&nbsp;&nbsp;&nbsp;在target&nbsp;machine输入<br />进入嵌入式板子gdbserver&nbsp;目录下,执行hello程序,超级终端输入<br />gdbserver&nbsp;59.69.74.87:2345&nbsp;/目录/hello(注意hello程序编译时必须是带-g调试信息的)<br />&nbsp;59.69.74.87主机IP,2345任意写一个。Hello一定要用arm-linux-gcc(我的板子)交叉编译,带-g编译。<br />2.&nbsp;在target&nbsp;machin出现<br />Process&nbsp;hello&nbsp;created;&nbsp;pid&nbsp;=&nbsp;68<br /><br />3.&nbsp;进入上面制作gdb时生成的arm&nbsp;-linux-gdb所在目录(也可以export),在PC机上输入<br />arm-linux-gdb&nbsp;hello&nbsp;(这个程序一定跟target&nbsp;machine程序保持一致,是交叉编译的)<br />(gdb)&nbsp;target&nbsp;remote&nbsp;203.239.30.207:2345&nbsp;(203.239.30.207为板子IP)<br />出现&nbsp;Remote&nbsp;debugging&nbsp;using&nbsp;59.69.75.186:2345<br />0x40002a00&nbsp;in&nbsp;??&nbsp;()<br /><br />(gdb)&nbsp;c&nbsp;//相当于主机gdb的run命令&nbsp;<br /><br />此时目标机上出现<br />Remote&nbsp;debugging&nbsp;from&nbsp;host&nbsp;59.69.74.87<br />hello,world<br /><br />连接成功后,这时候就可以输入各种gdb命令如list、run、next、step、break等进行程序调试了。<br /><br />调试结束.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;次**献给热爱linux的所有人<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />作者:db10<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2007.12.11于深圳<br /><br /><br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

2230

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

77

主题

2230

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部