最近在做一个arm linux下(for mini2440, mini6410) 的程序时发现,在PC上运行得非常好的程序,到了ARM板上就BUG了。为了找出ARM平台上的问题,必须实行调试。然而直接使用 gdb for arm是不明智的,一来gdb不容易编译成功,二来没有IDE的支持,调试效率很高。为此,使用远程调试是一个很好的办法。
为了实现CDT远程调试,必须满足以下几个条件:
1、交叉工具链中带有arm-linux-gdb
2、目标系统中有 gdbserver这个程序
3、编译程序、各种库时加入调试符号
一般来说,好的工具链都会自带GDB。而gdbserver可以从工具链中找到(可以使用搜索)。
编译程序和库时,加入-g 参数即可加入调试符号。自带编译系统的库可以通过相关参数控制,在此不必多说。
在这里着重介绍这种方法。虽然配置比较复杂,但是一旦配置成功,其效果是在eclipse中调试远程程序和调试本机程序无区别,其方便程序可想而知,希望各位对此部分有信心。以前笔者也十分反感这种麻烦的配置,但如果你配置好了,不仅收获以后的极大方便,也收获很多的知识!
这不必多说,NFS是调试嵌入式程序的利器。关于NFS的设置,参看本站另外的文章:从NFS启动Linux。
CDT中支持好几种远程调试的方法,其中有telnet, ftp等等。其中最方便地就属SSH了,因为SSH同时支持命令行和文件传输。配置好SSH后,cdt 启动调试时,会使用sftp将程序下载到开发板内,然后使用ssh执行gdbserver并自动从本机连接调试。但是SSH本身是个麻烦的软件,因为它依赖OpenSSL!
从openssl官网下载openssl。本文使用版本0.9.7m。交叉编译过程请自行参考网上文章。
从openssh官网下载。交叉编译过程请自行参考网上文章。
sshd,即SSH的服务器,运行需要以下几个准备工作:
a. 有一个单独的用户 sshd。可以添加到/etc/passwd中。具体格式请参考PC机上的/etc/passwd
b. 有一个单独的文件夹供使用:/var/empty。嵌入式板上若不可写,可建立在tmpfs之上。
c. 生成DSA、RSA公共key:使用 ssh-keygen 生成。
三个工作都顺利完成以后,可通过 /usr/sbin/sshd (这里指向具体的sshd路径)运行,无错误关闭后即已经运行为服务
在这几步中,最难的是第2步。第2步完全弄好了以后,以后的日子就轻松了。
a. 新建一个调试选项
上图中:
C/C++ Application 指的是当前项目中生成的可执行文件。
Remote Absolute File Path for C/C++ Application: 指对于远程主机而言的程序路径(调试试将会下载到此处)
(b) 添加一个连接。在上图中点击 New 会出现:
在这自然选择SSH Only。下一步:
输入远程主机的IP地址,以及给当前连接命名。按FINISH结束设置。
(c) 配置本地交叉工具链:
在Debugger选项卡中,GDB debugger一栏,选择你的交叉工具链中arm-linux-gdb。
好了,现在可以启动你的开发板,使用sshd,在CDT中可以直接运行该debug进行远程调试了!
本文平台:本文所讲的是linux平台,当然看完本文后windows平台的也是一样的原理,基本上一通百通了.
一:
linux远程调试原理( server+client):
1.server:gdbserver
命令: gdbserver ip:port appname(进程名)
通常用下面这个命令:
gdbserver ip:port --attach 22552(进程id)
2.client:gdb
命令: 终端输入gdb进去gdb 然后输入 target remote ip:port
3.截图如下:
server:
client连接上后:
client:
二:linux eclipse下的远程调试(当然前提是你所要调试的服务器 gdbserver已经开启了):
1.打开 debug configurations
2.创建一个自定义的 debug设置
3.设置 debug的种类
这里有三种种类 我们选择 gdb dsf manual remote debugging launcher (就是调试的时候 我们手动设置gdb参数进行调试)
其它两种的区别就由读者自己试验了,这里并不说明.
设置gdb ip port:
运行调试 选中自己刚刚定义的种类:
调试结果如下: