如何在VIM中实现对嵌入式软件的调试

发布者:SereneWhisper最新更新时间:2009-08-28 来源: 电子测试关键字:嵌入式系统  嵌入式软件  调试  Linux  VIM  gdb 手机看文章 扫描二维码
随时随地手机看文章

  引 言

  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所示的错误。

  出现这种情况的原因是,编译规则中选择了警告选项“-Werror”。它会将所有的警告转变为错误,而且出现的有关“getwd”函数的提示信息表明,这里编译器检测到的应该是一个“警告”,而不是真正的语法错误。所以,需改正编译选项:

  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的内容为:

  当执行“make test—pc”命令时,就会生成可运行在PC机上的可执行程序;执行“make test一em”则生成可运行在嵌入式目标板上的可执行程序。

  ②修改vimgdb的快捷键映射脚本,在VIM中实现PC调试器与交叉调试器的轻松切换。

  首先,针对vimgdb只能对字符串为“gdb”的系统命令进行调用,做如下的工作:

  其次,编辑文件/etc/vim/macros/gdb_mappings.vim。主要修改和添加的部分为:

  a.添加调试器转换函数,并设置转换开关为大写“E”键(Shift+E实现):

[page]

  即在进入调试状态后,屏蔽掉调试器转换快捷键E,并设置快捷键F8来显示变量值监测窗口。

  即在退出调试状态后,还原gdb命令为gdb—pc的调用,并还原“E”的调试器转换开关作用。

  使得启动vim后,便会在vim中启动对gdb进行调用的快捷键映射。

  至于在gdb_mappings.vim中具体设定的其他快捷键,由读者自己分析或设定即可。

  2.5 在VIM中对嵌入式软件进行调试

  下面设定目标板上的嵌入式软件调试时所用的快捷键:E为调试器转换开关;F9为进入调试模式;F8为开启变量监视窗口;空格键为开启命令行输入窗口;调试模式为PC通过超级终端对嵌入式目标板进行输入输出,Ubuntu8.10通过TCP/IP方式对嵌入式软件进行调试;PC机Linux IP为222.31.51.147;目标板IP为222.31.51.180;调试连接端口为1234。

  ①用VIM打开~/test/test.c,运行命令“:make test—em”,将生成的test—em文件拷贝到嵌入式平台的文件系统下,并在嵌入式平台运行命令,指定等待连接的交叉调试器地址、连接端口以及要调试的嵌入式程序:

  gdbserver 222.31.5l.147:1234 test—em

  嵌入式端会出现如下的类似提示信息,进入等待连接状态:

  Process test—em created:pid=80l

  Listening on port 1234

  ②按下大写“E”键(Shift+按键E),根据VIM窗口下方的提示信息,确定所选调试器。

  提示信息为“NOW! Gdb is ready for Embedded Sys—tem!!!”或者“Gdb is ready for PC,,Now”。

  ③按下F9,在出现的命令窗口输入命令“file test—em”后,会在VIM中的另一个窗口出现以下类似的调试信息:

  可以发现,在VIM中已经成功调用交叉调试器arm—linux—gdb了。以后的调试命令,都是通过先按下空格键,调出命令窗口,输入命令,回车后传递给调试器。按下空格,在命令窗口输入命令,连接嵌入式目标板端:

  target remote 222.31.51.180:1234

  此时,VIM中的调试信息窗口出现信息:

  至此,PC交叉调试器与嵌入式软件的连接完成,现在可以在VIM中对程序运行进行例如断点一类的设置动作;而嵌入式软件的输入输出,需要在嵌入式端来完成。这里先通过命令对代码设置断点,然后用命令continue继续程序运行(注意,这里不用run开始,因为当调试器与嵌入式端连接完成时,被调试的嵌入式软件已经开始运行),用命令next对程序实现步进调试。调试过程中的VIM如图3所示。

  图中测试代码要实现的是让用户输入5个数,然后经过排序后输出。对应的输入输出在嵌入式端体现出来。对应图3,此时在嵌入式端需要进行输入动作:

  从图3中可以直观地看清断点设置在哪里,程序现在步进到哪里。当程序第一次运行到图3中的17行时,按下F8键,开启变量值观测窗口,然后先后执行3个命令“cr i”、“cr j”、“cr a[i]”,这样,就可以在变量观测窗口实时地监测变量的数值了,如图4所示。

  这种调试方式提供对gdb所有命令功能的支持,而且当发现bug时,可以通过q命令终止调试,然后按F9跳出调试模式,就可以继续对源代码进行修改。

  至于在这之前的嵌入式软件在本地PC机上的调试,其过程比起调试运行在嵌入式设备上的软件来讲,只少了个远程连接的过程,其余调试过程都一样。至此,实现了在VIM中对嵌入式软件的调试。

  结 语

  嵌入式Linux系统的广泛应用,对嵌入式软件开发和调试环境的效率提出了更高的要求。GNU所提供的支持交叉编译与调试的工具链是一个很好的选择,尤其是其中的gdb调试工具完全满足嵌入式软件“交叉编译”的这种特殊需要;而且,功能强大的VIM编辑器又可实现对gdb调试器的整合,从而在VIM中实现了对嵌入式软件的调试功能。通过上面的实例可以看到,在VIM中对嵌入式软件进行调试更加直观和高效,从而也促使嵌入式软件的开发效率得到了质的提高。

关键字:嵌入式系统  嵌入式软件  调试  Linux  VIM  gdb 引用地址:如何在VIM中实现对嵌入式软件的调试

上一篇:VxWorks下ComPactPCI总线驱动程序设计
下一篇:吉时利扩展DC源测量仪器的量程兼容ACS软件

推荐阅读最新更新时间:2024-05-02 20:51

Linux 2.6 内核的嵌入式系统应用
摘 要:在分析Linux2.6内核新特性的基础上,在S3C2410开发板上移植了2.6内核和新的文件系统,并成功地对H.264编解码多媒体系统提供了支持。 关键词:Linux 内核 嵌入式系统 S3C2410   随着多媒体技术与通讯技术相结合的信息技术的快速发展和互联网的广泛应用,PC 时代也过渡到了后PC时代。在数字信息技术和网络技术高速发展的后PC时代,嵌入式技术越来越与人们的生活紧密结合。   操作系统为用户使用计算机及其外部设备提供最基本的接口程序,管理计算机上的资源。随着应用领域的扩大,为了适应不同的应用场合,考虑到系统的灵活性、可伸缩性以及可裁剪性,一种以应用为中心、以计算机技术为基础、软硬件可裁剪、适应应用系
[嵌入式]
基于PXA255的ARM Linux操作系统移植
1.引言 ARM处理器是当今应用最为广泛的处理器芯片,它功耗小、成本低、性能优越,在消费电子类产品中占据主导地位。Linux操作系统近年来Linux移植/ARM在嵌入式领域中发展很快,由于其强大的性能和开源免费的特点,越来越受到嵌入式系统开发商的青睐,信息家电、网络设备、手持终端等都是嵌入式Linux应用的广大市场。 在Linux移植/ARM嵌入式开发中,把操作系统移植到开发板是进行嵌入式应用开发的前提和基础。ARM Linux是针对ARM体系结构的嵌入式Linux操作系统。本文主要阐述了将ARM Linux系统移植到基于PXA255处理器的Linux移植/ARM开发板CSB226上的方法和关键技术。
[单片机]
基于PXA255的ARM <font color='red'>Linux</font>操作系统移植
Linux2.4与Linux2.6内核调度器的比较研究
Linux的内核开发是一个漫长的过程,自2001年11月开发出2.5.0以来,Linux内核的发展十分迅速,作了很多重大的改进,性能也有了很大的提高。内核调度器的改进是最主要的进步之一,本文对比研究了Linux2.4和Linux2.6的调度器,全面剖析了Linux2.6对调度器的改进。 一个成功的调度器的基本要求可以概括为以下三点: (1)减少花在调度上的时间,以增加花在执行程序上的时间; (2)在多处理器系统上,保持处理器的负载平衡; (3)对交互式应用有良好的响应速度。 但是,一个成功的调度器是很难设计好的,因为一个真正投入运行的系统受到很多因素的制约。相对于Linux2.6,Linux2.4的调度器有很多的不足之处,
[嵌入式]
Ubuntu安装arm-linux-gcc 详细步骤
gcc编译的只能在Linux中使用,要在ARM中使用,还要使用交叉编译工具: arm-linux-gcc 1.获取压缩包 首先尝试使用命令行安装,结果如下: 但是此方法需要翻墙获取(我听别人说的…),一般情况不会成功的。 所以在主机上下载 arm-linux-gcc的安装包,通过FTP传输工具发送压缩包到Ubuntu中: 发送到 /tmp 路径下,如图: 2.解压 压缩包到指定路径 然后解压压缩包到根目录,注意这里使用tar命令,根据压缩包的后缀信息看出使用bzip2压缩然后tar命令分包: sudo tar -xjvf arm-linux-gcc-4.6.4-arm-x86_64.tar.bz2 -C /
[单片机]
Ubuntu安装arm-<font color='red'>linux</font>-gcc 详细步骤
Linux内核在S3C2410上移植的研究
嵌入式系统就是以应用为中心,以计算机技术为基础的软、硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。Linux操作系统是一种性能优良、源码公开且被广泛应用的免费操作系统,由于其体积小,可裁减,运行速度高等优点,因此可以作为研究嵌入式操作系统和非实时操作系统的典范。EL-ARM-830+型教学实验系统是一种综合的教学实验系统,该系统采用了ARM92 0T核,32位微处理器,实现了多模块的应用实验。在实验板上有丰富的外围扩展资源,可以完成ARM的基础实验、算法实验和数据通信实验、以太网实验。 1 Linux的实验环境搭建 1.1 Redhat9.0操作系统的安装 安装Redhat9.0前,先
[单片机]
HI3531ARM调试printf的实现
void UART_Putc(char c) { if (c == 'n') *(unsigned int *)(UART0_ADDR + 0X00) = 'r'; delay_x(0x800); *(unsigned int *)(UART0_ADDR + 0X00) = c; } unsigned int val_i=0; void UART_Print(const char *str,...) { va_list unnamed_p; char *sval; unsigned int tmp=0; va_start( unnamed_p, str); whil
[单片机]
嵌入式系统在大射电望远镜5米模型上悬索控制中的应用
摘要:介绍了ARM9和嵌入式实时操作系统μC/OS-II在大射电望远镜5米模型上悬索控制中的应用。介绍了基于ARM9处理器(Atmel公司的AT91RM9200)的触摸屏、LCD等电路的设计。分析了用AT91RM9200产生6路独立的PWM信号的方法。给出了在嵌入式实时操作系统μC/OS-II下的多任务应用软件的设计实例,并成功实现了六轴联动。   关键词:ARM9 μC/OS(MicroC/OS) RTOS 六轴联动 “大射电望远镜FAST(Five hundred meter Aperture Spherical Telescope)预研究”是中国科学院知识创新设计方案 。通过六根悬索驱动馈源舱完成馈源的大范围跟踪,保证馈
[嵌入式]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved