当前位置:首页 > 嵌入式linux应用程序调试方法
[root->nfs]# cat exports # Version 1.1 # Path Client(Flags) # IPs /home/zpf/ftp 172.16.51.188(rw,no_root_squash,sync,wdelay) # 172.16.51.188 我理解的含义:
NFS服务器输出的目录 客户端(挂载时的flag)#当前挂载的设备IP地址组
需要说明的一点:在这四个文件中,只有/var/lib/nfs/rmtab 给出的目录是客户端实际挂载的目录(共享/home/zpf/ftp, 客户端可以挂载它的一个子目录/home/zpf/ftp/arm_linux_resource),其他给出的都是服务器共享的目录名称。
2 应用程序实例
编写一个简单的C程序test.c ------------------------------------------- /*This is a test program.*/ int main(void) { int i;
for(i=0;i<10;i++)
printf(\return 0; }
------------------------------------------- 编译该程序:
#arm-linux-gcc -o test test.c 2.1 FTP方式
首先将test下载到target board。启动target board的linux,在超级终端中执行: #cd /var
#ftp
ftp>bin //以binary mode传输文件 ftp>get test ftp>exit
然后修改文件属性: #chmod +x test #./test
这时可以查看结果了。
2.2 NFS方式
在target board端挂载linux server的共享输出目录,并且运行程序。 #mkdir /mnt/nfs
#mount -o nolock -t nfs
这时应该可以显示linux server的共享目录的内容。然后执行: #./test
3 总结
这两种方式在应用程序不是特别复杂时区别不是很大,但是当开发程序比较复杂时,采用NFS方式显然效率要高得多。完成应用程序得开发,调试好后就可以下载到嵌入式目标板的flash文件系统,或者直接编译到嵌入式linux内核并且烧写到flash,从而最终成为一个独立的嵌入式应用程序。
---------------------------------------
参考书目:《building embedded linux systems》
《嵌入式linux系统开发详解--基于EP93XX系列ARM》
这两本书在过程上都比较细致,很适合初学者学习。在实践熟悉的基础上,提升理论高度,这是我所认可的学习方法。
三 GDB调试应用程序
GNU工具链中的GDB可以读linux开发的应用程序进行调试,它能够控制程序的执行、查看和改变程序的变量、分析程序的内在结构、研究崩溃程序的核心文件等等;
在嵌入式系统中,同样可以利用专用的gdb调试应用程序,由于通常目标板上的资源都比较有限,所以利用gdb在嵌入式系统上调试应用程序时,通常和nfs配合使用。
在嵌入式目标系统应用程序的调试中,由于应用程序是在嵌入式目标系统上运行,而gdb调试器则运行在linux服务器上,因此需要采用远程调试的方法;
采用这种远程调试的原因和交叉编译的原因是一样的,均由于受到嵌入式目标板系统设备上有限的资源限制,因此需要利用linux服务器的部分资源,完成系统的调试任务。
远程调试环境由运行在linux服务器上特殊版本的gdb调试器和运行载嵌入式目标机上的调试服务器gdbserver共同构成,两者通过串口或TCP连接。使用 GDB标准串行协议协同工作,实现对目标机上的系统内核和上层应用的监控和调试功能。
就目前而言,嵌入式Linux系统中,主要有三种远程调试方法,分别适用于不同场合的调试工作:用ROM Monitor调试目标机程序、用KGDB调试系统内核和用gdbserver调试用户空间程序。这三种调试方法的区别主要在于:目标机远程调试stub 的存在形式的不同,而其设计思路和实现方法则是大致相同的。
而我们最常用的是调试应用程序,就是采用gdb+gdbserver的方式进行调试。在很多情况下,用户需要对一个应用程序进行反复调试,特别是复杂的程序。采用GDB方法调试,由于嵌入式系统资源有限,一
般不能直接在目标系统上进行调试,通常采用gdb+gdbserver的方式进行调试。Gdbserver在目标系统中运行,gdb则在linux服务器上运行。
一般linux发行版中都有一个可以运行的gdb,但开发人员不能直接使用该发行版中的gdb来做远程调试,而要获取gdb的源代码包,针对 arm平台作一个简单配置,重新编译得到相应gdb。
gdb的源代码包可以从http: //ftp.cs.pu.edu.tw/Linux/sourceware/gdb/releases/下载,最新版本为gdb-6.6。或者直接到GNU的网站上下载:http://www.gnu.org/software/gdb/download/
下载到某个目录,例如下载到目录:/home/vicky。
下载完后,进入/home/vicky目录,配置编译步骤如下:
#tar jxvf gdb-6.6-tar-bz2
#cd gdb-6.6
#./configure --target=arm-linux --prefix=/usr/local/arm-gdb -v
#make
#make install
#export PATH=$PATH:/usr/local/arm-gdb
进入gdbserver目录(在gdb-6.6/gdb/gdbserver, 找这个找了半天….):
#./configure --target=arm-linux --host=arm-linux
#make CC=/usr/local/arm/3.4.1/bin/arm-linux-gcc
(这一步要指定arm-linux-gcc的位置,具体的问题根据自己系统中的设置修改这个命令行)
通过nfs或者下载将gdb放到目标板,根据资料,需要调试的程序也可以采用nfs,也可以直接下载到目标板上。
下面就可以用gdb+gdbserver调试我们开发板上的程序了。
做如下假设:目标机IP:172.16.51.143, linux服务器172.16.51.130;
要进行gdb调试,首先要在目标系统上启动gdbserver服务。在gdbserver所在目录下输入命令: 在串口中输入
#./gdbserver 172.16.51.130:15000 runapp
表示目标板上的gdbserver接收来自linux服务器172.16.51.130的调试指令,gdbserver监听15000 端
口,然后启动runapp程序;
(可能这个时候会提示找不到libthread_db.so.1这个动态库,到/usr/local/arm/3.4.1/arm-linux/lib 也就是你arm交叉编译环境中的库中找到这个文件,下载到设备上,并且保证这个库文件放置在LD_LIBRARY_PATH 指定的那些目录中,否则,你需要利用export LD_LIBRARY_PATH= … 重新指定你的lib目录);
出现提示:
Process runapp created: pid=80
Listening on port 15000
(然后转到linux服务器上)
进入arm-linux-gdb目录中执行该程序 #cd
#./arm-linux-gdb /home/zpf/rtvs4104d_zpf/release/runapp
这里需要特殊说明的是: 上面的命令行,必须给出你要调试的arm版本的应用程序在linux服务器上的路径;如果你当前工作目录就是应用程序所在目录的话,那么arm-linux-gdb这个命令你就需要加入PATH这个环境变量,以便在任何目录直接调用;如果arm-linux-gdb不知道arm版本的应用程序的路径,那么它就不能适应-g加入的调试信息;这样你在使用list, break命令时候,就会提示No symbol table is loaded. Use the \
命令行输入后,出现如下提示 GNU gdb 6.6
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type \
There is absolutely no warranty for GDB. Type \This GDB was configured as \mainapp: No such file or directory.
然后等待进一步输入命令
(gdb) target remote 172.16.51.143:15000
(172.16.51.143为开发板IP)
出现提示:
共分享92篇相关文档