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

如何在VIM中对嵌入式软件进行调试,第1张

        引言

  GNU免费提供了一整套工具链,为嵌入式Linux程序的开发和调试提供了完整的支持。其强大的gdb调试工具可以方便地对嵌入式平台上的程序进行跟踪调试;而Linux下强悍的VIM编辑器,不仅可以方便地调用make文件对代码进行编译,而且通过脚本的配置还可轻松地成为高效的代码编辑环境。

  1  gdb对嵌入式软件的调试模式

  许多非Linux的嵌入式系统已经在使用gdb与gdb stub对目标板进行远程“交叉调试”;然而,因为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。

如何在VIM中对嵌入式软件进行调试,第2张

  图1  TCP/IP联机的嵌入式软件调试模式

  PC调试器:GNU gdb6.8。

  目标板Linux内核:2.6.13。

  目标板CPU:S3C2440(ARM9架构)。

 

  交叉编译器:armlinuxgcc3.4.1。

  交叉调试器:自编译GNU gdb6.8。

  目标板gdb服务端:自编译 GNU gdbserver6.8。

  跨平台开发工具路径:~/buildtools/armlinux,且已经设置好系统路径变量。

  测试代码及程序路径:~/test,包含程序代码test.c及Makefile。

  所用软件包存放路径:~/down。

  所用软件包:VIM编辑器源码vim7.1.tar.bz2、vimgdb711.13.tar.gz、GNU gdb源码gdb6.8.tar.bz2。

  2.2  对VIM源码打vimgdb补丁并编译安装

  ① 运行下面的命令,解压VIM源码及vimgdb补丁文件,并对VIM源码打补丁:

  cd ~/down

  tar jxvf vim7.1.tar.bz2

  tar zxvf vimgdb711.13.tar.gz

  patch d vim71 backup p0 < vimgdb/vim71.diff

  ② 运行下面命令,对VIM编译器进行编译和安装:

  cd ~/down/vim71/src

  make

  make install

  执行完上述 *** 作后,VIM将会被安装在/usr/local路径下。如果想修改安装路径,可在上述的编译安装前,打开~/down/vim71/src/Makefile文件的862行安装路径选项并修改。如将VIM安装在/usr路径下,则将 862 #prefix = $(HOME)修改为862 prefix = /usr。

  ③ 安装vimgdb的runTIme文件,运行下面的命令:

  cd ~/down/vimgdb

  tar zxfv vimgdb_runTIme.tgz C /usr/share/vim/vimfiles

  2.3  建立交叉调试嵌入式软件的gdb组件

  ① 编译嵌入式gdb调试器服务端gdbserver,运行如下的命令:

  cd ~/down/gdb6.8/gdb/gdbserver

  ./cONfigure??host=armlinux ??target=armlinux

  CC=armlinuxgcc make

  将当前目录下的gdbserver拷贝到目标板文件系统的/bin目录下,以备交叉调试用。

  ② 编译安装交叉调试器gdb,运行如下命令:

  cd ~/down/gdb6.8

  ./configure ??target=armlinux ??prefix=/home/popeye/buildtools/armlinux/

  注意,这里的prefix的值必须填写绝对路径,而不能用“ ~”来替代用户路径/home/popeye,否则会提示prefix路径赋值错误。然后运行:

  make

  这个过程中,可能会出现图2所示的错误。

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

  cd~/down/gdb6.8/gdb

  gedit Makefile

  注意,此处的Makefile是在执行完上述的make命令后才产生的,在最初的代码包里不含有这个文件。对文件的145行进行修改,去掉WERROR_CFLAGS的赋值,即将“145 WERROR_CFLAGS = Werror”修改成“145 WERROR_CFLAGS =”。然后:

  cd ~/down/gdb6.8

  make

  make install

如何在VIM中对嵌入式软件进行调试,第3张

  图2  make过程中的错误提示

  最后进入~/buildtools/armlinux/bin中,发现交叉调试器armlinuxgdb已经存在了。

  2.4  在VIM中实现对嵌入式软件调试前的准备

  在嵌入式软件开发过程中的习惯做法是: 首先,在PC机上编译调试程序,如果在PC机上运行正常,再进行交叉编译。然后,将软件移植到目标板上,如果在目标板上出现bug,再用交叉调试器armlinuxgdb进行调试。

  简而言之,对嵌入式软件的调试过程包含两个部分:PC机上调试部分和嵌入式平台上的调试部分。在这个过程中,可能既用到PC机上的调试器gdb,又用到交叉调试器armlinuxgdb,而对应的是同一个源代码程序和运行在不同平台上的两个可执行程序。同时涉及两个调试器转换的问题,但vimgdb只能对字符串为“gdb”的系统命令进行调用。

  下面,将这个比较困难的问题简单化:

  ① 编辑适用的Makefile,控制生成对应不同平台的可执行程序:

  cd ~/test

  其中,test.c为实验代码,Makefile为编译规则,我们简单编写Makefile的内容为:

  testpc: test.c

  gcc g Wall o testpc test.c

  testem: test.c

  armlinuxgcc g Wall o testem test.C

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

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

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

  mv /usr/bin/gdb /usr/bin/gdbpc

  cd ~/buildtools/armlinux/bin

  ln s /usr/bin/gdbpc gdb

  由于已经将~/buildtools/armlinux/bin添加到了系统路径里面,所以执行完上述 *** 作后,在任何时候,运行“gdb”命令时,真正运行的调试器取决于这里gdb所连接的调试器。

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

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

 

  let s:emOS_k = 1

  nmap E :call emOS()

  funcTIon! s:emOS()

  if s:emOS_k

  let s:emOS_k = 0

  exec ":!ln sf ~/buildtools/armlinux/bin/armlinuxgdb ~/buildtools/armlinux/bin/gdb"

  echohl ErrorMsg

  echo "NOW! Gdb is ready for Embedded System !!!"

  echohl None

  else

  let s:emOS_k = 1

  exec ":!ln sf /usr/bin/gdbpc ~/buildtools/armlinux/bin/gdb"

  echohl ErrorMsg

  echo "Gdb is ready for PC,, Now"

  echohl None

  endif

  EndfuncTIon

  b. 在语句if s:gdb_k行下添加代码:

  nmap :bel 25vsplit gdbvariables

  nunmap E

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

  c. 在let s:gdb_k = 1行下添加代码:

  exec ":!ln sf /usr/bin/gdbpc ~/buildtools/armlinux/bin/gdb"

  nmap E :call emOS()

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

 

  d. 在/etc/vim/vimrc中添写语句:

  run macros/gdb_mappings.vim

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

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

  

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/dianzi/2713409.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-17
下一篇 2022-08-17

发表评论

登录后才能评论

评论列表(0条)

保存