《2022年如何在VIM中对嵌入式软件进行调试 .pdf》由会员分享,可在线阅读,更多相关《2022年如何在VIM中对嵌入式软件进行调试 .pdf(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、如何在 VIM 中对嵌入式软件进行调试引言GNU 免费提供了一整套工具链,为嵌入式Linux 程序的开发和调试提供了完整的支持。其强大的gdb 调试工具可以方便地对嵌入式平台上的程序进行跟踪调试;而Linux 下强悍的VIMVIM编辑器,不仅可以方便地调用make文件对代码进行编译,而且通过脚本的配置还可轻松地成为高效的代码编辑环境。1gdb 对软件嵌入式软件的调试模式许多非 Linux 的嵌入式系统已经在使用gdb 与 gdb stub对目标板进行远程“ 交叉调试 ” ;然而,因为Linux内核实现了ptrace ()系统调用,所以在对嵌入式应用程序进行调试的时候并不
2、需要gdb stub ,而采用gdb 套件提供的gdb 服务器来对目标板上的嵌入式应用程序进行调试。目标板上的gdb 服务端 gdbserver与主机上的gdb 调试器的通信方式 主 要 有 两 种 : 使 用 串 口 通 信 的 “交 叉 串 行 连 接 ” 和 使 用 网 口 的“TCP/IP”联机。鉴于 PC端的方便性以及串口资源有限,尤其是现在的笔记本电脑甚至已经不存在串口,所以,大多采用TCP/IP 方式,即PC主机与目标板通过网线直连或者 PC机与目标板通过路由或者hub 等组成局域网通信。这种调试模式。2 在 VIM 中实现对嵌入式
3、软件的调试我们知道, gdb 的功能虽然强大,但由于其基于命令行的操作,所以调试过程不直观,而且 Windows下的调试环境集调试与代码编辑为一体,当出现bug 的时候,可以方便地对源代码进行修改,相比而言,gdb 在这方面又有些失色。既然VIM 和 gdb 的功能如此强大,又完全免费,而且完全适合嵌入式这种特殊的开发模式,那么有没有将二者强强联合的方法呢?有,那就是vimgdb。vimgdb 是给 VIM 提供一个可选特性的补丁。它可以在VIM编辑器里提供完整的gdb 调试器支持,比如设置断点、查看变量值、gdb 命令补全等等,并且这些操作可以在VIM 中直观地显示出来。下面阐述在VIM 中
4、实现对嵌入式软件调试的具体过程。2.1 系统环境及所用软件包版本PC操作系统: Ubuntu8.10 。PC编译器: GNU gcc4.3.1 。图 1TCP/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,包
5、含程序代码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 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 5 页 - - - - - - - - -
6、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
7、)修改为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拷贝到目标板文件系统的/b
8、in目录下,以备交叉调试用。编译安装交叉调试器gdb,运行如下命令:cd /down/gdb6.8 ./configure ?target=armlinux ?prefix=/home/popeye/buildtools/armlinux/ 注意, 这里的 prefix的值必须填写绝对路径,而不能用 “ ” 来替代用户路径/home/popeye ,否则会提示prefix路径赋值错误。然后运行:make 这个过程中,可能会出现图2 所示的错误。出现这种情况的原因是,编译规则中选择了警告选项“Werror”。它会将所有的警告转变为错误,而且出现的有
9、关“getwd”函数的提示信息表明,这里编译器检测到的应该是一个“ 警告 ” ,而不是真正的语法错误。所以,需改正编译选项:cd/down/gdb6.8/gdb gedit Makefile 注意,此处的Makefile是在执行完上述的make命令后才产生的,在最初的代码包里不含有这个文件。对文件的145 行进行修改,去掉WERROR_CFLAGS的赋值,即将 “145 WERROR_CFLAGS = Werror” 修改成 “145 WERROR_CFLAGS =” 。然后:cd /down/gd
10、b6.8 make make install 图 2make过程中的错误提示最后进入 /buildtools/armlinux/bin中,发现交叉调试器armlinuxgdb已经存在了。2.4 在 VIM中实现对嵌入式软件调试前的准备在嵌入式软件开发过程中的习惯做法是:首先,在PC 机上编译调试程序,如果在PC机上运行正常, 再进行交叉编译。然后, 将软件移植到目标板上,如果在目标板上出现bug,名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 5 页 - - - - -
11、- - - - 再用交叉调试器armlinuxgdb进行调试。简而言之, 对嵌入式软件的调试过程包含两个部分:PC机上调试部分和嵌入式平台上的调试部分。在这个过程中, 可能既用到PC机上的调试器gdb, 又用到交叉调试器armlinuxgdb ,而对应的是同一个源代码程序和运行在不同平台上的两个可执行程序。同时涉及两个调试器转换的问题,但vimgdb 只能对字符串为“gdb”的系统命令进行调用。下面,将这个比较困难的问题简单化:编辑适用的Makefile ,控制生成对应不同平台的可执行程序:cd /test 其中, test.c为实验代码, Makefile为编译规则,
12、我们简单编写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”的系统命令进行
13、调用,做如下的工作: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
14、实现):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
15、 sf /usr/bin/gdbpc /buildtools/armlinux/bin/gdb" echohl ErrorMsg echo "Gdb is ready for PC, Now" echohl None endif Endfunction 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 5 页 - - - - - - - - - b. 在语句 if s:gdb_k行下添加代码:nmap :bel 25vsplit gdbvari
16、ables 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 后,便会
17、在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打开 /tes
18、t/test.c, 运行命令 “ : make testem” , 将生成的 testem文件拷贝到嵌入式平台的文件系统下,并在嵌入式平台运行命令,指定等待连接的交叉调试器地址、连接端口以及要调试的嵌入式程序:gdbserver 222.31.51.147:1234 testem 嵌入式端会出现如下的类似提示信息,进入等待连接状态:Process testem created; pid = 801 Listening on port 1234 按下大写 “E”键( Shift+ 按键 E) ,根据 VIM 窗口下方的提示信息,确定所选调试器。提示
19、信息为 “NOW! Gdb is ready for Embedded System!”或者 “Gdb is ready for PC, Now”。按下 F9,在出现的命令窗口输入命令“file testem”后,会在VIM 中的另一个窗口出现以下类似的调试信息:GNU gdb 6.8 Copyright (C) 2008 Free Software Foundation, Inc. …… This GDB was configured as "host=i686pclinuxgnu
20、target=armlinux". (gdb) file testem Reading symbols from /home/popeye/test/testem…done. (gdb)可以发现,在VIM 中已经成功调用交叉调试器armlinuxgdb了。以后的调试命令,都是通过先按下空格键,调出命令窗口,输入命令,回车后传递给调试器。按下空格,在命令窗口输入命令,连接嵌入式目标板端:target remote 222.31.51.180:1234 此时, VIM中的调试信息窗口出现信息:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - -
21、- - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 5 页 - - - - - - - - - (gdb) target remote 222.31.51.180:1234 Remote debugging using 222.31.51.180:1234 New Thread 801 0 x40000dd0 in ? () from /lib/ldlinux.so.2 (gdb)而在嵌入式端出现提示信息:ProcESS testem created; pid = 801 Listening on port 1234 Remote debugging fr
22、om host 222.31.51.147 至此, PC交叉调试器与嵌入式软件的连接完成,现在可以在VIM 中对程序运行进行例如断点一类的设置动作;而嵌入式软件的输入输出,需要在嵌入式端来完成。这里先通过命令对代码设置断点,然后用命令continue继续程序运行 (注意, 这里不用run 开始, 因为当调试器与嵌入式端连接完成时,被调试的嵌入式软件已经开始运行),用命令next 对程序实现步进调试。调试过程中的VIM。图 3 正在进行交叉调试的VIM 图中测试代码要实现的是让用户输入5 个数,然后经过排序后输出。对应的输入输出在嵌入式端体现出来。对应图3,此时在嵌入式端需要进行输入动作:Lis
23、tening on port 1234 Remote debugging from host 222.31.51.147 Enter 10 numbers: a0=25 a1=56 a2=…… 从图 3 中可以直观地看清断点设置在哪里,程序现在步进到哪里。当程序第一次运行到图 3 中的17 行时,按下F8 键,开启变量值观测窗口,然后先后执行3 个命令 “cr i”、“cr j”、“cr ai”,这样,就可以在变量观测窗口实时地监测变量的数值了,。图 4 带实时变量值监测窗口的VIM 这种调试方
24、式提供对gdb 所有命令功能的支持,而且当发现bug 时,可以通过q 命令终止调试,然后按F9 跳出调试模式,就可以继续对源代码进行修改。至于在这之前的嵌入式软件在本地PC机上的调试, 其过程比起调试运行在嵌入式设备上的软件来讲,只少了个远程连接的过程,其余调试过程都一样。至此,实现了在VIM中对嵌入式软件的调试。3 结语嵌入式 Linux 系统的广泛应用, 对嵌入式软件开发和调试环境的效率提出了更高的要求。GNU所提供的支持交叉编译与调试的工具链是一个很好的选择,尤其是其中的gdb 调试工具完全满足嵌入式软件“ 交叉编译 ” 的这种特殊需要;而且,功能强大的VIM 编辑器又可实现对gdb 调试器的整合,从而在VIM中实现了对嵌入式软件的调试功能。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 5 页 - - - - - - - - -