转载_使用DDD+GDB开发ARM Linux程序
发布时间:2020-12-13 23:04:11 所属栏目:百科 来源:网络整理
导读:今天又取得了一些进展,赶快写下来以免自己忘记。 自从Linux在我的板子上跑起来之后,我一直在想一个问题,怎么调试将来写的程序。其实我在Linux开发方面真得很外行,到了今天才知道GDB到底是干什么用的,呵呵。我相信很多人从Bootloader调试开始一直都使用L
今天又取得了一些进展,赶快写下来以免自己忘记。
自从Linux在我的板子上跑起来之后,我一直在想一个问题,怎么调试将来写的程序。其实我在Linux开发方面真得很外行,到了今天才知道GDB到底是干什么用的,呵呵。我相信很多人从Bootloader调试开始一直都使用LED啊,printf这样的方法来调试。我做毕设时,就是在MTDBLOCK里面划出一个USER分区,然后把编译好的程序放入文件系统映像,通过Bootloader用串口下到NAND里,然后mount上调试,实在很花时间。今天,白痴的我终于找到了一条捷径,已经不咳嗽了!
先介绍下DDD和GDB,GDB是一种用于调试Linux下程序的工具,它不仅能调试C/C++,还可以调试Pascal等很多其他语言。我们看个例子:假设有一个程序叫做test.c,要用GDB调试它,首先,编译的时候需要加上产生debug信息选项“-g”,如#arm-linux-gcctest.c -o test-g;然后,由于我们并不是开发本机程序,在目标机(arm)上需要用一个server启动这个含有调试信息的程序,当然,本机和目标机之间得有一定的数据共享方式(如nfs)和一定的通信方式(如以太网或串口);最后,在本机上启动一个GDB客户端,就可以登陆到目标机的server上调试程序了。GDB的原理网上也有很多文章说,可以搜索下,但是我是初学者,就不去看那些内容了。为了让大家更加明确GDB和DDD的区别,我们先看一个GDB的调试过程:
我通过以太网调试,本机IP地址192.168.2.31,目标机(arm开发板IP地址192.168.2.223),本机通过nfs共享开发目录lgraphics。
首先本机上编译:
lxz@lxzlinux:~/lgraphics>arm-linux-gcc lgraphics.c -o lg -g
切换到目标机:
[root@(none) lgraphics]# gdbserver192.168.2.31:2345 lg
Process lg created; pid = 402 Listening on port 2345
切换到本机:
lxz@lxzlinux:~/lgraphics>arm-linux-gdb lg GNU gdb 6.6 Copyright (C) 2006 Free Software Foundation,Inc. GDB is free software,covered by the GNU General Public License,and you are welcome to change it and/or distribute copies of it under certainconditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. This GDB was configured as "--host=i686-pc-linux-gnu--target=arm-linux"... (gdb) target remote 192.168.2.223:2345 lg Remote debugging using 192.168.2.223:2345 lg 0x40001290 in _start () from /lib/ld-linux.so.2
此时,目标机上也会出现:
Remote debugging from host 192.168.2.31
在本机上输入:
(gdb) bmain
Breakpoint 1 at 0x9c00: file lgraphics.c,line442. (gdb)cont Continuing.
Breakpoint 1,main () atlgraphics.c:442
442 (gdb)step 445
好了,看到这里,差不多就明白GDB是干什么的、怎么用了吧。我相信你会和我一样对GDB界面的不友好表示愤慨,想想Windows下的开发工具,哪一种调试的时候还是文本界面的。幸运的是,有一些勤快的人,帮我们写了很多GDB的图形化前端,我们更本不用像上面这样使用GDB。
开始说DDD。DDD是一种GDB的图形化前端,就是一种用图形界面帮你输入繁琐的GDB调试指令工具。当然,也有很多文章说DDD多么不足,用Insight来取代它之类的。我的Suse里恰好就有DDD,我也不管那么多了,先用了。看看用DDD的时候怎么调试:
一样本机上编译:
lxz@lxzlinux:~/lgraphics>arm-linux-gcc lgraphics.c -o lg -g
切换到目标机:
[root@(none) lgraphics]# gdbserver192.168.2.31:2345 lg
Process lg created; pid = 402 Listening on port 2345
切换到本机:
lxz@lxzlinux:~/lgraphics> ddd-debugger arm-linux-gdb lg
然后就会启动DDD的图形界面,在窗口下方有一个文本输入框,这里就是ddd的基础gdb的所在,在这里输入targetremote 192.168.2.223:2345lg,提示信息和我们用GDB时候是一样的。不同的是,除了这句连接目标机的指令,其他指令都不用输入了,可以在图形化界面里找到,这我就不说了。另外,连接目标机的指令也可以用在DDD中设置,不用输入,可以查找其他介绍DDD使用的文章。下面是DDD的图形界面,工具栏下面的是watch,代码可以设置断点(红色点),可以看到单步位置(绿色箭头),右边是执行控制工具条,最下面是GDB的输入和输出显示。
看到这里,想我一样的菜鸟们一定发现了,原来Linux程序可以这么好调啊,简直和CE没有什么差别了,呵呵。下面介绍为了使用GDB+DDD所要做的东西。我不是从零开始建立的,具体的包依存关系我也不明白,只好假设你在安装Linux的时候已经安装了像GCC,DDD之类的工具。GDB的源代码包gdb-6.6.tar.bz2可以从
ftp://gcc.gnu.org上下载到,还有一个要求是你已经安装了交叉编译器arm-linux-gcc。
下载下来后:
# tar xvjf gdb-6.6.tar.bz2
# mkdir gdbbuild
# cd gdbbuild
# ../gdb-6.6/configure--target=arm-linux
这里,--prefix参数是需要安装的目录,然后
# make
# make install
这样,arm-linux-gdb这个工具就在/home/lxz/lxzgdb/bin里头了,你可以把这个路径添加到PATH里面去
接下来建立gdbserver,在gdbbuild的上一级目录下
# mkdir gdbserverbuild
# cd gdbserverbuild
# CC=arm-linux-gcc ../gdb-6.6/gdb/gdbserver/configure--host=arm-linux
一样,--prefix参数是需要安装的目录,然后
# make
# make install
有的文章里说,要去除arm-linux-strip的调试信息
# cd /home/lxz/lxzgdbserver/bin
# arm-linux-strip gdbserver
把这个gdbserver复制到你的开发板上,就OK了。
今天就写到这里。
===================================================================================== SPLIT ===================================================================================== ARM Linux 交叉调试工具及方法一、交叉调试工具
二、交叉调试工具的生成
三、配置和编译
在源码目录下进行配置,配置完成后会在当前目录和 gdb 目录下生成 Makefile 文件,命令如下:
四、测试以调试测试例程为例: 连接上后开发板的串口上会出现以下打印: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- swift #1 变量 常量
- c# – 如何跳转到PrintDocument中的下一页?
- react-native fetch 请求封装
- ruby – rand(Range) – 没有将Range隐式转换为Integer
- LSTM长短记,长序依赖可追忆(深度学习入门系列之十四)
- FLEX 与 FTP
- Oracle 删除根据id 删除重复数据
- -O1 / 2/3 with -std = c 1y / 11/98 – 如果包含我收到错误
- ios – Xcode 7无法为AlamoFire 3.x(CocoaPods)加载底层模块
- ruby-on-rails – Rspec / Rails:未初始化的常量ActiveSup