全部博文(38)
分类: LINUX
2009-08-21 09:58:49
先介绍下DDD和GDB,GDB是一种用于调试Linux下程序的工具,它不仅能调试C/C++,还可以调试Pascal等很多其他语言。我们看个例子:假设有一个程序叫做test.c,要用GDB调试它,首先,编译的时候需要加上产生debug信息选项“-g”,如#arm-linux-gcc test.c -o test -g;然后,由于我们并不是开发本机程序,在目标机(arm)上需要用一个server启动这个含有调试信息的程序,当然,本机和目标机之间得有一定的数据共享方式(如nfs)和一定的通信方式(如以太网或串口);最后,在本机上启动一个GDB客户端,就可以登陆到目标机的server上调试程序了。GDB的原理网上也有很多文章说,可以搜索下,但是我是初学者,就不去看那些内容了。为了让大家更加明确GDB和DDD的区别,我们先看一个GDB的调试过程:
lxz@lxzlinux:~/lgraphics> arm-linux-gcc lgraphics.c -o lg -g
[root@(none) lgraphics]# gdbserver 192.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 certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty"
for details.
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
(gdb) b
main
(设置断点到main函数)
Breakpoint 1 at 0x9c00:
file lgraphics.c, line 442.
(gdb)
cont
(开始执行)
Continuing.
Breakpoint 1, main () at lgraphics.c:442 (遇到断点,并显示断点程序行)
442 int
i, j, b = 0;
(gdb)
step (单步执行)
445
linitgraph("/dev/fb0");
(显示目前程序行)
lxz@lxzlinux:~/lgraphics> arm-linux-gcc lgraphics.c -o lg -g
[root@(none) lgraphics]# gdbserver 192.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的所在,在这里输入target remote 192.168.2.223:2345 lg,提示信息和我们用GDB时候是一样的。不同的是,除了这句连接目标机的指令,其他指令都不用输入了,可以在图形化界面里找到,这我就不说了。另外,连接目标机的指令也可以用在DDD中设置,不用输入,可以查找其他介绍DDD使用的文章。下面是DDD的图形界面,工具栏下面的是watch,代码可以设置断点(红色点),可以看到单步位置(绿色箭头),右边是执行控制工具条,最下面是GDB的输入和输出显示。
# CC=arm-linux-gcc ../gdb-6.6/gdb/gdbserver/configure --host=arm-linux --prefix=/home/lxz/lxzgdbserver