在VIM中实现对嵌入式软件的调试
时间:08-06
来源:作者:中北大学 何景波 孙运强 姚爱琴
点击:
引 言
GNU免费提供了一整套工具链,为嵌入式Linux程序的开发和调试提供了完整的支持。其强大的gdb调试工具可以方便地对嵌入式平台上的程序进行跟踪调试;而Linux下强悍的VIM编辑器,不仅可以方便地调用make文件对代码进行编译,而且通过脚本的配置还可轻松地成为高效的代码编辑环境。流传着这样一种说法,"世界上的程序员分三种,一种使用Emacs,一种使用VIM,剩余的是其他。"不去辩论这句话的对与错,单纯从字面意义上来理解,也足见VIM的魅力了。因此,在VIM中实现对嵌入式软件的调试,我们便得到了一个高效、稳定的嵌入式Linux的开发环境。
1 gdb对嵌入式软件的调试模式
许多非Linux的嵌入式系统已经在使用gdb与gdbstub对目标板进行远程"交叉调试";然而,因为Linux内核实现了ptrace()系统调用,所以在对嵌入式应用程序进行调试的时候并不需要gdb stub,而采用gdb套件提供的gdb服务器来对目标板上的嵌入式应用程序进行调试。
目标板上的gdb服务端gdbserver与主机上的gdb调试器的通信方式主要有两种:使用串口通信的"交叉串行连接"和使用网口的"TCP/IP"联机。鉴于PC端的方便性以及串口资源有限,尤其是现在的笔记本电脑甚至已经不存在串口,所以,大多采用TCP/IP方式,即PC主机与目标板通过网线直连或者PC机与目标板通过路由或者hub等组成局域网通信。这种调试模式如图1所示。
2 在VIM中实现对嵌入式软件的调试
我们知道,gdb的功能虽然强大,但由于其基于命令行的操作,所以调试过程不直观,而且Windows下的调试环境集调试与代码编辑为一体,当出现bug的时候,可以方便地对源代码进行修改,相比而言,gdb在这方面又有失色。既然VIM和gdb的功能如此强大,又完全免费,而且完全适合嵌入式这种特殊的开发模式,那么有没有将二者强强联合的方法呢?有,那就是vimgdb。
vimgdb是给VIM提供一个可选特性的补丁。它可以在VIM编辑器里提供完整的gdb调试器支持,比如设置断点、查看变量值、gdb命令补全等等,并且这些操作可以在VIM中直观地显示出来。下面阐述在VIM中实现时嵌入式软件调试的具体过程。
2.1 系统环境及所用软件包版本
PC操作系统:Ubuntu8.10。
PC编译器:GNU gcc4.3.1。
PC调试器:GNU gdb6.8。
目标板Linux内核:2.6.13。
目标板CPU:S3C2440(ARM9架构)。
交叉编译器:arm-linux-gcc3.4.1。
交叉调试器:自编译GNU gdb6.8。
目标板gdb服务端:自编译GNU gdbserver6.8。
跨平台开发工具路径:~/build-tools/arm-linux,且已经设置好系统路径变量。
测试代码及程序路径:~/test,包含程序代码test.c及Makefile。
所用软件包存放路径:~/down。
所用软件包:VIM编辑器源码vim一7.1.tar.bz2、vimgdb71-1.13.tar.gz、GNU gdb源码gdb-6.8.tar.bz2。
2.2 对VIM源码打vimgdb补丁并编译安装
①运行下面的命令,解压VIM源码及vimgdb补丁文件,并对VIM源码打补丁:
执行完上述操作后,VIM将会被安装在/usr/local路径下。如果想修改安装路径,可在上述的编泽安装前,打开~/down/vim71/src/Makefile文件的862行安装路径选项并修改。如将VIM安装在/usr路径下,则将862#prefix=$(HOME)修改为862 prefix=/usr。
③安装vimgdb的runtime文件,运行下面的命令:
ca~/down/vimgdb
tar zxfv vimgdb_runtime.tgz-C/usr/share/vim/vimfiles
2.3 建立交叉调试嵌入式软件的gdb组件
①编译嵌入式gdh调试器服务端gdbserver,运行如下的命令:
将当前目录下的gdbserver拷贝到目标板文件系统的/bin目录下,以备交叉调试用。
②编译安装交叉调试器gdb,运行如下命令:
注意,这里的prefix的值必须填写绝对路径,而不能用"~"来替代用户路径/home/popeye,否则会提示prefix路径赋值错误。然后运行:
make
这个过程中,可能会出现图2所示的错误。
cd~/down/gdb一6.8/gdb
gedit Makefile
注意,此处的MaKefile是在执行完上述的make命令后才产生的,在最初的代码包里不含有这个文件。对文什的145行进行修改,去掉WERROR_CFLAGS的赋值,即
GNU免费提供了一整套工具链,为嵌入式Linux程序的开发和调试提供了完整的支持。其强大的gdb调试工具可以方便地对嵌入式平台上的程序进行跟踪调试;而Linux下强悍的VIM编辑器,不仅可以方便地调用make文件对代码进行编译,而且通过脚本的配置还可轻松地成为高效的代码编辑环境。流传着这样一种说法,"世界上的程序员分三种,一种使用Emacs,一种使用VIM,剩余的是其他。"不去辩论这句话的对与错,单纯从字面意义上来理解,也足见VIM的魅力了。因此,在VIM中实现对嵌入式软件的调试,我们便得到了一个高效、稳定的嵌入式Linux的开发环境。
1 gdb对嵌入式软件的调试模式
许多非Linux的嵌入式系统已经在使用gdb与gdbstub对目标板进行远程"交叉调试";然而,因为Linux内核实现了ptrace()系统调用,所以在对嵌入式应用程序进行调试的时候并不需要gdb stub,而采用gdb套件提供的gdb服务器来对目标板上的嵌入式应用程序进行调试。
目标板上的gdb服务端gdbserver与主机上的gdb调试器的通信方式主要有两种:使用串口通信的"交叉串行连接"和使用网口的"TCP/IP"联机。鉴于PC端的方便性以及串口资源有限,尤其是现在的笔记本电脑甚至已经不存在串口,所以,大多采用TCP/IP方式,即PC主机与目标板通过网线直连或者PC机与目标板通过路由或者hub等组成局域网通信。这种调试模式如图1所示。
2 在VIM中实现对嵌入式软件的调试
我们知道,gdb的功能虽然强大,但由于其基于命令行的操作,所以调试过程不直观,而且Windows下的调试环境集调试与代码编辑为一体,当出现bug的时候,可以方便地对源代码进行修改,相比而言,gdb在这方面又有失色。既然VIM和gdb的功能如此强大,又完全免费,而且完全适合嵌入式这种特殊的开发模式,那么有没有将二者强强联合的方法呢?有,那就是vimgdb。
vimgdb是给VIM提供一个可选特性的补丁。它可以在VIM编辑器里提供完整的gdb调试器支持,比如设置断点、查看变量值、gdb命令补全等等,并且这些操作可以在VIM中直观地显示出来。下面阐述在VIM中实现时嵌入式软件调试的具体过程。
2.1 系统环境及所用软件包版本
PC操作系统:Ubuntu8.10。
PC编译器:GNU gcc4.3.1。
PC调试器:GNU gdb6.8。
目标板Linux内核:2.6.13。
目标板CPU:S3C2440(ARM9架构)。
交叉编译器:arm-linux-gcc3.4.1。
交叉调试器:自编译GNU gdb6.8。
目标板gdb服务端:自编译GNU gdbserver6.8。
跨平台开发工具路径:~/build-tools/arm-linux,且已经设置好系统路径变量。
测试代码及程序路径:~/test,包含程序代码test.c及Makefile。
所用软件包存放路径:~/down。
所用软件包:VIM编辑器源码vim一7.1.tar.bz2、vimgdb71-1.13.tar.gz、GNU gdb源码gdb-6.8.tar.bz2。
2.2 对VIM源码打vimgdb补丁并编译安装
①运行下面的命令,解压VIM源码及vimgdb补丁文件,并对VIM源码打补丁:
执行完上述操作后,VIM将会被安装在/usr/local路径下。如果想修改安装路径,可在上述的编泽安装前,打开~/down/vim71/src/Makefile文件的862行安装路径选项并修改。如将VIM安装在/usr路径下,则将862#prefix=$(HOME)修改为862 prefix=/usr。
③安装vimgdb的runtime文件,运行下面的命令:
ca~/down/vimgdb
tar zxfv vimgdb_runtime.tgz-C/usr/share/vim/vimfiles
2.3 建立交叉调试嵌入式软件的gdb组件
①编译嵌入式gdh调试器服务端gdbserver,运行如下的命令:
将当前目录下的gdbserver拷贝到目标板文件系统的/bin目录下,以备交叉调试用。
②编译安装交叉调试器gdb,运行如下命令:
注意,这里的prefix的值必须填写绝对路径,而不能用"~"来替代用户路径/home/popeye,否则会提示prefix路径赋值错误。然后运行:
make
这个过程中,可能会出现图2所示的错误。
cd~/down/gdb一6.8/gdb
gedit Makefile
注意,此处的MaKefile是在执行完上述的make命令后才产生的,在最初的代码包里不含有这个文件。对文什的145行进行修改,去掉WERROR_CFLAGS的赋值,即
2.4 在VIM中实现对嵌入式软件调试前的准备
在嵌入式软件开发过程中的习惯做法是:首先,在PC机上编译调试程序,如果在PC机上运行正常,再进行交叉编泽。然后,将软件移植到目标板上,如果在目标板上出现bug,再用交叉调试器arm-linux-gdb进行调试。
简而占之,对嵌入式软件的调试过程包含两个部分:PC机上调试部分和嵌入式平台上的凋试部分。在这个过程中,可能既用到PC机上的调试器gdb,又用到交叉调试器arm-linux-gdb,而对应的是同一个源代码程序和运行在不同平台上的两个可执行程序。同时涉及两个调试器转换的问题,但vimgdb只能对宁符串为"gdb"的系统命令进行调用。下面,将这个比较困难的问题简单化:
①编辑适用的Makefile,控制生成对应不同平台的可执行程序:
cd~/test
其中,test.c为实验代码,Makefile为编译规则,我们简单编写Makefile的内容为:
- 基于ARM的新型智能交通信号灯系统设计(07-05)
- 基于VIM的嵌入式存储控制器的研究与实现(11-14)
- 在VIM中的嵌入式软件调试(02-25)
- Linux下vim编辑器的使用小技巧(08-16)
- 配置vim在源码中自动添加作者信息(07-31)
- VIM编辑器学习方法介绍(05-12)