建立交叉调试环境

  大家都知道,开发的嵌入式应用程序怎么最终能在嵌入式设备中运行起来,前期需要不断的调试,但是,嵌入式程序与PC下的程序调试存在很大的差别。这不像PC机下的程序直接在PC机下边运行边调试(GDB调试),而嵌入式的程序需要在嵌入式设备下运行,在上位机(PC)中调试,这就产生了交叉调试。

  本文的环境:

   虚拟机:vmware7.0

   Linux系统:Fedora9.0

   开发板:mini2440

   交叉编译工具链:arm-linux-gcc(友善之臂提供,可去其官网下载)

  好了,万事俱备,只欠开始行动了。

一、设置NFS共享

  交叉调试的前提需要设置NFS共享,在上位机下配置NFS服务,建立NFS共享目录。

1、PC机下开启NFS服务

[root@localhost home]# service nfs restart

2、设置共享目录

[root@localhost home]# vim /etc/exports

打开exports文件后,添加如下内容:

/home/NFS       *(rw,sync,no_root_squash)

保存退出。

说明一下,上面的含义为:/home/NFS 表示我的共享目录,* 表示任意的开发板的ip地址,rw表示可读写,sync表示同步,no_root_squash表示有root权限。

接下来使用如下命令使共享目录生效:

[root@localhost home]# exportfs -ra

不信看看:

[root@localhost home]# exportfs -v

是不是出现了:/home/NFS       <world>(rw,wdelay,no_root_squash,no_subtree_check),这样就设置成功了共享目录。

3、交叉编译gdb(前提你的系统已经安装了交叉编译工具链)

下载一个gdb源码包(我的为:gdb-7.0a.tar.bz2),在虚拟机下解压并编译:

[root@localhost toolchain]# tar jxvf gdb-7.0a.tar.bz2

解压后进入其目录,然后

[root@localhost gdb-7.0]# ./configure --target=arm-linux -prefix=/opt/toolchain/gdb7.0_arm

-prefix=/opt/toolchain表示安装在/opt/toolchain/gdb7.0_arm这个目录下。

[root@localhost gdb-7.0]# make

[root@localhost gdb-7.0]# make install

这样就安装成功了,瞧瞧/opt/toolchain/gdb7.0_arm中有bin、share、lib目录,进入bin目录可以发现发现:

建立交叉调试环境_第1张图片

修改配置:

[root@localhost /]# vim /etc/profile

在最后面将PATH环境变量写成如下(大家不要跟我一样啊,因为我做了好多的配置,你们只要将/opt/toolchain/gdb7.0_arm/bin加入这个PATH中就行了,格式跟下面的一样):

export PATH=/opt/Qt4.6.4_forArm/bin:/opt/cmake/bin:/opt/toolchain/4.4.3/bin:/opt/toolchain/gdb7.0_arm/bin:$PATH

保存退出,并设置生效:

[root@localhost /]# source /etc/profile

4、交叉编译gdb-server

进入解压的源码包gdb7.0中,可以看到其中有个gdb目录,gdb目录下有个gdbserver目录,进入这个目录:

[root@localhost gdb-7.0]# cd gdb/gdbserver

交叉编译安装:

[root@localhost gdbserver]# ./configure --target=arm-linux --host=arm-linux

[root@localhost gdbserver]# make

这样交叉编译gdbserver成功了,可以发现在当前目录下有个:gdbserver(可执行文件),将其拷贝之共享目录(我的为:/home/NFS)。

5、拷贝libthread库至共享目录(网上这么说的,我没有做这一步,大家可以参考下,不碍事的)

在交叉编译工具链中有libthread_db-1.0.so这个动态链接文件、将其拷贝至/home/NFS/lib中(为了方便管理,我在NFS目录下建立一个lib目录,所有外来库文件都放在这个lib目录下),建立符号链接:

[root@localhost lib]# ln -s libthread_db-1.0.so libthread_db.so

[root@localhost lib]# ln -s libthread_db-1.0.so libthread_db.so.1

当你在开发板mount的时候,先设置一下库文件搜索路径:LD_LIBRARAY_PATH

三、开发板下mount共享目录

1、连接开发板,设置好网络(开发板的ip地址,我的开发板ip地址为:172.16.28.100,大家根据自己实际情况设定,我的Linux系统的ip为:172.16.28.22)

2、开发板下执行:

[root@FriendlyARM /]# mount -t nfs -o intr,nolock,rsize=1024,wsize=1024 172.16.28.22:/home/NFS /mnt

mount上后,你可以在开发板的/mnt 目录下发现其中的内容和PC机下共享目录/home/NFS 中内容是一样的。

3、测试

在PC的共享目录下编写一个print.c文件,如:

建立交叉调试环境_第2张图片

保存后并交叉编译:

[root@localhost NFS]# arm-linux-gcc -Wall -g print.c -o print

得到了一个可执行的print文件。

进入开发板挂载的目录中(我的/mnt),执行如下:

[root@FriendlyARM /mnt]# ./gdbserver 172.16.28.22:6666 print

172.16.28.22为我的Linux系统的ip地址,6666为端口号(可以自行设定,最好大于1024,使得不和系统的端口冲突),print为要交叉调试的可执行文件。如果执行成功出现:

Process print created; pid = 752
Listening on port 6666

呵呵,pid可能各不相同(不必担心)。

在Linux的共享目录下执行:

[root@localhost NFS]# arm-linux-gdb print

出现:

GNU gdb (GDB) 7.0
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=i686-pc-linux-gnu --target=arm-linux".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/NFS/print...done.
(gdb) target remote 172.16.28.100:6666

(红色表示敲入的命令),172.16.28.100(我的开发板的ip),回车后:

Remote debugging using 172.16.28.100:6666
warning: Unable to find dynamic linker breakpoint function.
GDB will be unable to debug shared library initializers
and track explicitly loaded dynamic code.
0x400007b0 in ?? ()
(gdb) list 

(红色为命令),回车后:

1       #include <stdio.h>
2
3       int main(void)
4       {
5               int i;
6
7               for (i = 0; i < 10; i++)
8               {
9                       printf("i=%d ", i);
10                      printf("\n");
(gdb)
显示了源码,哈哈哈,交叉调试基本上成功了,现在可以用基本的GDB命令可以调试了(现在程序在开发板中运行,而我们在上位机下调试)。


注意:交叉调试不能用run命令来执行,因为remote后,程序就开始了,只要设置断点,然后c命令就会跑到断点处。


在写此文时参考了:http://www.linuxidc.com/Linux/2011-02/32733.htm,在此表示感谢,欢迎大家转载,转载请注明出处CSDN。email:[email protected]




你可能感兴趣的:(虚拟机,linux,嵌入式,Path,debugging,linker)