这段时间搭建了一个基于hisilicon的arm平台搭建gdb+gdbserver调试环境,网上对hisilicon平台的搭建资料不多,基本上是arm-linux-gdb的,而没有arm-uclibc-linux-gdb的,我把我的搭建过程记录下来,也跟大家分享一下,哪有有不对的地方,还请指正。
由于我的宿主机上自带了交叉编译器,所以只需要编译gdbserver即可。如果需要编译gdb的,可以在网上搜集到相关资料。这里不加叙述。
1,首先是gdbserver的编译:
指令如下:
下载gdb-6.6.tar.gz
解压:tar xvzf gdb-6.6.tar.gz
若下载的为gdb-6.6.jar.bz2,
Mkdir gdb-6.6
解压格式为 tar jxvf gdb-6.6.jar.bz2 –c /gdb-6.6
进入文件夹:cd gdb-6.6/gdb/gdbserver
编译:cc=/opt/hisilicon/toolchains/arm-uclibc-linux-soft/bin/arm-uclibc-linux-gcc ./configure --host=arm-uclibc-linux
Make clean
Make all
生成 arm格式的gdbserver 。
2,程序的编译:
程序在进行编译的时候一定要加上-g进行编译,不然不能调试。
3,将编译好的程序目标码hello和gdbserver放到同一个文件夹gdbtest下。
4,到宿主机上登录管理员帐号,键入命令:/sbin/service nfs restart
启动nfs服务。
5,开发板的设置,可以在超级终端下进行:
连接好开发板和宿主机后:
首先在hisilicon#下设置开发板的IP :setenv ipaddr 192.168.1.123
setenv serverip 192.168.1.124(宿主机IP)
setenv bootargs 'mem=32M console=ttyAMA0,57600 root=/dev/mtdblock/1 rootfstype=jffs2 boardip=192.168.1.123 mmz=sdram,1,0x620M,32M'
saveenv
可以使用Printenv查看是否设置成功,Ping 192.168.1.124查看网络是否连通。
重新启动开发板,进入开发板的系统界面。
再次设置IP:ifconfig eth1 192.168.1.123 up
设置成功后,ping 192.168.1.124查看网络是否连通。
网络连通后,则键入mount 192.168.1.124:/home/a/gdbtest /mnt/
将192.168.1.124上目录为/home/a/gdbtest/下的文件挂载到开发板的mnt/目录下。
cd mnt
Ls查看mnt目录下是否有程序目标码hello和gdbserver,如果有,说明挂载成功,如果无,挂载未成功,寻找原因,重新挂载。
挂载成功后:./gdbserver 192.168.1.124:1234 hello
启动开发板上的gdbserver服务,其中192.168.1.124为宿主机的IP,1234为端口,可以是任意四位数。hello为要跟踪的应用程序目标码。
开发板上出现Process ./ hellocreated; pid = 618
Listening on port 1234
此时,开发板开始监听宿主机的gdb调试
6,宿主机:进入gdbtest目录下 :cd gdbtest
键入:arm-uclibc-linux-gdb hello
进入gdb调试界面后
键入:target remote 192.168.1.123:1234
在开发板出现:Remote debugging from host 192.168.1.124
用C继续运行。
需要注意的地方:
1, 编译gdbserver时,一定要注意你的交叉编译器的绝对地址和你的开发板是什么类型的。如果交叉编译器是arm-linux-gcc,在配置的时候,则应该键入 cc=交叉编译器的绝对地址/arm-linux-gcc ./configure --host=arm-linux;这个是比较关键的地方,因为在开发板上运行的gdbserver必须要编译成ARM ELF格式,否则无法运行。我所用的交叉编译器是arm-uclibc-linux-gcc,所以配置必须是
cc=/opt/hisilicon/toolchains/arm-uclibc-linux-soft/bin/arm-uclibc-linux-gcc ./configure --host=arm-uclibc-linux ,由于网上有人写经验说arm-uclibc-linux-gcc的交叉编译器在配置host的时候也是用arm-linux的,但是这样编译出来的gdbserver由于跟交叉编译器不匹配,所以格式会是intel 80383 elf的,而这种格式在开发板上是不能运行的。查看文件格式可以用命令file查看。正确的格式应该是这样:
键入file gdbserver
gdbserver: ELF 32-bit LSB executable, ARM, version 1, dynamically linked (uses shared libs), not stripped
当查看到的gdbserver格式如上所示时,该gdbserver就是可以在开发板上运行的。
2, 编译应用程序的目标码时,一定要加上-g 编译,由于目标码也是在开发板上运行的,所以格式也必须是 arm elf的,查看方式同上。
编译格式为:arm-uclibc-linux-gcc –g –o 程序 目标码
键入file hello
hello: ELF 32-bit LSB executable, ARM, version 1, statically linked, not stripped
3, 利用nfs挂载目录的时候,如果挂载失败,原因可能有二个:1,nfs未启动;2,网络未连通;可以使用mount 192.168.1.124(为本机的ip):/home /mnt 测试是否开通nfs服务。网络是否连通用ping 测试。
4, 网络无法ping通时,可以通过ifconfig –a查看网卡状态,利用ifconfig对网络IP重新配置,也可以通过route add 修改路由。
在搭建环境过程中,如果出现指令不能执行,则必定是权限问题。在宿主机可以改变身份登录,修改权限,执行命令。对要运行的gdbserver和hello可以用chmod命令改变他们的权限。Chmod 777 gdbserver ;chmod 777 hello,使所有人都可以对他们进行读写执行操作。
写得比较凌乱,还请见谅。