DAVINCI调试ARM端应用程序

 

 

拿到DM365的开发板好几天了,各种环境也都搭建成功了,Demo程序也跑起来了。现在就想如何来调试应用程序。在开始之前心里其实就明白,Linux下是不可能有Windows下那么好用的IDE工具的。所以首先想到使用gdb,然后再去找找有没有稍微人性化一点的IDE工具。下面就是我的调试过程。

        


--------------------------------------------------------------------------------

1.         建立源文件(hello.c)

host # gedit hello.c

输入:

#include <stdio.h>

int main (int argc, char **argv)

{

         int x, y;

       x = 20, y = 10;

       printf("%d+%d=%d/n", x, y, x+y);

       printf("%d*%d=%d/n", x, y, x*y);

       printf("%d/%d=%d/n", x, y, x/y);

       return 0;

}

        


--------------------------------------------------------------------------------

2.         查看是否已安装ARM-CROSS的GDB工具

host # arm_v5t_le-gdb

bash: arm_v5t_le-gdb: command not found

错误:命令找不到。说明没有供交叉编译的GDB工具。

        


--------------------------------------------------------------------------------

3.         安装GDB工具

下载最新的gdb安装包:ftp.gnu.org/gnu/gdb

这里我下载了最新的gdb-7.1.tar.gz

         安装过程参见:

http://processors.wiki.ti.com/index.php/Debugging_a_Linux_Application_with_MontaVista_5.0

         这里讲的很清楚,下面只记录安装命令:

         host # cp gdb-7.1.tar.gz /home/debug/tmp

host # tar zxvf gdb-7.1.tar.gz

host # cd gdb-7.1

host # ./configure --host=i686-pc-linux-gnu --target=armv5tl-montavista-linux-gnueabi --prefix=/opt/mv_pro_5.0/montavista/pro/devkit/arm/v5t_le

host # make && make install

安装完成,在/opt/mv_pro_5.0/montavista/pro/devkit/arm/v5t_le/bin目录下生成3个文件:

armv5tl-montavista-linux-gnueabi-gdb

armv5tl-montavista-linux-gnueabi-gdbtui

armv5tl-montavista-linux-gnueabi-run

 


--------------------------------------------------------------------------------

4.         安装GDB-Server

host # cd /gdb-7.1/gdb/gdbserver  (注:gdbserver在gdb-7.1.tar.gz解压出来的包里面)

host # CC=arm_v5t_le-gcc ./configure  --host=armv5tl-montavista-linux-gnueabi --prefix=/home/debug

host # make && make install

安装完成,在指定目录(/home/debug)生成一个bin目录,目录下就有gdbserver

 


--------------------------------------------------------------------------------

5.         编译源文件(hello.c)

host # arm_v5t_le-gcc -g hello.c -o hello         (注意加上-g选项)

编译结束后,即可生成一个带debug信息的可执行文件hello

 


--------------------------------------------------------------------------------

6.         下载可执行文件(hello)到目标板

因为这里没有使用NFS,所以需手动下载到目标板上,可通过tftp下载。

注:主机IP地址:192.168.1.109;目标板IP地址:192.168.1.144

host # cp hello /tftpboot

target# cd /opt/test

target# tftp -g -r hello 192.168.1.109

target# chmod 755 hello

         在目标板的 /opt/test目录下得到hello可执行文件,并修改其权限,否则没有运行权限。

        


--------------------------------------------------------------------------------

7.         调试可执行文件(hello)

首先在目标板上运行gdbserver,如下:

target# gdbserver 192.168.1.109:4567 ./hello

Process ./sample created; pid = 658

Listening on port 4567

接下来,目标板一直处于监听状态。

注:以上命令中gdbserver后面跟的是主机的IP地址,以及两者的通信端口。

        

         然后在主机上运行gdb,如下:

host# armv5tl-montavista-linux-gnueabi-gdb ./hello

         打印出gdb版本等相关信息。

         注:因为在之前的环境配置中,已经把/opt/mv_pro_5.0/montavista/pro/devkit/arm/v5t_le/bin添加到PATH中,所以可以直接运行armv5tl-montavista-linux-gnueabi-gdb。

         接下来就进入gdb调试环境了,首先就要连接目标板的gdbserver,如下:

(gdb) target remote 192.168.1.144:4567

         注:端口号要和目标板创建gdbserver时的端口号一致。

         在继续gdb调试之前,可以先看一下目标板的响应情况:

Remote debugging from host 192.168.1.109

         说明两者已经成功连接了。

        

         接下来,就是普通的gdb调试了:

         (gdb) l main

         (gdb) b 6

         Breakpoint 1 at 0x8468: file helloworld.c, line 6.

         (gdb) r

The "remote" target does not support "run".  Try "help target" or "continue".

         这里提示说,远程的目标不支持run,请试continue,具体为什么我也不清楚,可能程序已经开始运行了,既然说可以continue那就先试一下。

         (gdb) c

Continuing.

warning: `/lib/libc.so.6': Shared library architecture unknown is not compatible with target architecture arm.

warning: .dynamic section for "/lib/libc.so.6" is not at the expected address (wrong library or version mismatch?)

Error while mapping shared library sections:

/lib/ld-linux.so.3: 没有那个文件或目录.

Breakpoint 1, main (argc=1, argv=0xbead3e64) at helloworld.c:6

6               printf("%d+%d=%d/n", x, y, x+y);

         中间有一些警告和错误,但是还是可以继续运行的,具体这个错误以后再说。

         单步:

         (gdb) n

         查看目标板响应:

         20+10=30

         惊喜,说明程序成功往下走了一步。

         。。。

         把剩余的代码运行完:

(gdb) c

Continuing.

 

Program exited normally.

同时,查看目标板响应:

20*10=200

20/10=2

 

Child exited with retcode = 0

 

Child exited with status 0

GDBserver exiting

        

一次调试差不多也就完成了。

        


--------------------------------------------------------------------------------

8.         使用DDD工具

虽然使用GDB可以调试程序,毕竟还是很不好用的。除了实在没有办法的情况下,总希望有一款好用的IED工具来代替它。下面先介绍一下自带的DDD工具的使用方法。

目标板操作相同,启动gdbserver:

target# gdbserver 192.168.1.109:4567 ./hello

主机端使用如下命令:

ddd -debugger armv5tl-montavista-linux-gnueabi-gdb ./hello

此时,就会启动DDD工具,如图8-1所示。

 

 

图8-1 DDD界面

         一看就不是很好用,但毕竟是个图形化调试工具。

         整个界面和一般的IDE界面类似,有菜单栏,工具栏,源代码区,悬浮的按钮窗口,以及最下面的命令窗口。

         在运行之前,你必须在命令窗口连接gdbserver,在闪烁的光标处输入:

         target remote 192.168.1.144:4567

接下来的操作差不多一看就明白了。如:

在源代码区点击某一行,然后点击工具栏上的Break图标,即会创建一个断点。

在悬浮的按钮窗口中,点击Step、Next、Cont等等,来完成程序的执行。

 

感受:经常会出现找不到鼠标,不知道其他人是不是这样,只能关闭再打开。而且命令窗口中不能复制粘贴。四个字:勉强能用。

        


--------------------------------------------------------------------------------

9.         使用insight工具

我也是网上看来,说insight比ddd好用,所以就尝试一下。

下载地址:ftp://sourceware.org/pub/insight/releases

下载最新版本:insight-6.8-1.tar.bz2

解压安装如下:

host# mv insight-6.8-1.tar.bz2 /home/debug/tmp

host# chmod 755 insight-6.8-1.tar.bz2

host# tar xjf insight-6.8-1.tar.bz2

host# cd insight-6.8-1

host# ./configure --host=i686-pc-linux-gnu --target=armv5tl-montavista-linux-gnueabi --prefix=/opt/mv_pro_5.0/montavista/pro/devkit/arm/v5t_le

host# make && make install

安装完成,在/opt/mv_pro_5.0/montavista/pro/devkit/arm/v5t_le/bin目录下会生成一个可执行文件:

armv5tl-montavista-linux-gnueabi-insight

        

         因为路径/opt/mv_pro_5.0/montavista/pro/devkit/arm/v5t_le/bin已经在之前的环境设置中添加了,所以这里可以直接运行该路径的可执行文件,如下:

         host# armv5tl-montavista-linux-gnueabi-insight

         一运行,insight图形界面就出来了,如图9-1所示。

        

         图9-1 insight界面

         给人第一印象,貌似比DDD精致一点,具体性能怎么样,用了再说。

        

下面仍然使用上面的hello程序来验证一下insight的功能。

目标板操作相同:

target# gdbserver 192.168.1.109:4567 ./hello

         主机操作如下:

host# armv5tl-montavista-linux-gnueabi-insight ./helloworld

出现如图9-2所示的insight界面,在代码区的最前面一列,我们可以看到“-”标记,这表明当前行代码是有效的,用鼠标单击“-”标记,就会出现红色的标记(如图9-2中的第6行前面),这就是断点了,设置非常方便,再次点击就会删除断点。

        

         图9-2 insight打开可执行文件的显示(红色标记为断点)

        

第一步工作仍然是连接目标板(gdbserver),打开菜单栏的FileàTarget Settings…

         出现如图9-3所示的窗口。

 

        

         图9-3 Target Settings窗口

         如图9-3设置:

         Target:           GDBServer/TCP

         Hostname:    192.168.1.144

         Port:               1000

         注:我想修改端口号为4567的,但是Port后面的编辑框却不接受输入。我现在Linux主机是运行在虚拟机VMWare(6.52版本)上的,重启Linux后还是不能输入,不知道为什么。

         这里不能修改端口号,那么只能修改目标板了(无奈),如下:

target# gdbserver 192.168.1.109:1000 ./hello

         主机端打开insight,并设置Target Settings如图9-3所示。然后点击图标,或者打开菜单栏的RunàRun,开始运行,跳出对话框如图9-4所示。

 

 

图9-4 Run时出现的警告

同时,目标板显示:

Remote debugging from host 192.168.1.109

 

此时,若点击Yes按钮,则主机端显示:

段错误

目标板显示:

readchar: Got EOF

Remote side has terminated connection.  GDBserver will reopen the connection.

Listening on port 1000

若点击No按钮,则主机端显示如图9-5所示:

 

 

图9-5 Run警告点击No跳出的对话框

此时,点击OK按钮即可。Insight界面如图9-6所示。

 

 

图9-6 Run之后的insight界面

首先,工具栏中的调试工具都亮起来了,而且在源代码的main开始第一句代码处高亮显示。此时你可以使用这几个按钮进行调试了。调试结果和上面相同。

 

另外,还有一些查看工具,点击按钮,查看寄存器,如图9-7所示。

 

 

图9-7 查看寄存器

点击按钮,查看内存,如图9-8所示。

 

 

图9-8 查看内存

点击按钮,查看堆栈,如图9-9所示。

 

 

图9-9 查看堆栈

点击按钮,查看表达式,如图9-10所示。

 

 

图9-10 查看表达式

点击按钮,查看当前变量,如图9-11所示。

 

 

图9-11 查看当前变量

点击按钮,查看断点设置情况,如图9-12所示。

 

 

图9-12 查看断点设置情况

 

感受:比较好用。唯一的缺陷就是不能接受键盘输入(我不知道别人的是不是这样),如果这存在这样的bug,那这个软件也基本上是废了。

问题解决:

网上搜索了一阵,很多人在问这个问题,但是却没有给出一个明确的答复。大概是说TCL/tk库和现有的输入法有冲突造成的。

试着关闭SCIM输入法(右键点击Linux右下角的SCIM输入法,选择退出)。

哈哈,问题解决,这下insight基本上是一个完美的gdb调试前端了,吼吼。

如果你想使用SCIM输入法,只需在终端输入:

host# scim -d


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/talent258/archive/2010/07/19/5746987.aspx

你可能感兴趣的:(linux,application,输入法,工具,library,debugging)