@H_301_7@
lxz@lxzlinux:~/lgraphics> arm-linux-gcc lgraphics.c -o lg -g
@H_301_7@
@H_301_7@
切换到目标机:
@H_301_7@
[root@(none) lgraphics]# gdbserver 192.168.2.31:2345 lg
Process lg created; pid = 402
Listening on port 2345
@H_301_7@
@H_301_7@
切换到本机:
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
@H_301_7@
此时,目标机上也会出现:
@H_301_7@
Remote debugging from host 192.168.2.31
@H_301_7@
@H_301_7@
在本机上输入:
@H_301_7@
(gdb) b main (设置断点到main函数)
Breakpoint 1 at 0x9c00: file lgraphics.c,line 442.
(gdb) cont (开始执行)
Continuing.
@H_301_7@
Breakpoint 1,main () at lgraphics.c:442 (遇到断点,并显示断点程序行)
442 int i,j,b = 0;
(gdb) step(单步执行)
445 linitgraph("/dev/fb0"); (显示目前程序行)
@H_301_7@
@H_301_7@
好了,看到这里,差不多就明白GDB是干什么的、怎么用了吧。我相信你会和我一样对GDB界面的不友好表示愤慨,想想Windows下的开发工 具,哪一种调试的时候还是文本界面的。幸运的是,有一些勤快的人,帮我们写了很多GDB的图形化前端,我们更本不用像上面这样使用GDB。
@H_301_7@
@H_301_7@
开始说DDD。DDD是一种GDB的图形化前端,就是一种用图形界面帮你输入繁琐的GDB调试指令工具。当然,也有很多文章说DDD多么不足,用Insight来取代它之类的。我的Suse里恰好就有DDD,我也不管那么多了,先用了。看看用DDD的时候怎么调试:
@H_301_7@
@H_301_7@
@H_301_7@
一样本机上编译:
@H_301_7@
lxz@lxzlinux:~/lgraphics> arm-linux-gcc lgraphics.c -o lg -g
@H_301_7@
@H_301_7@
切换到目标机:
@H_301_7@
[root@(none) lgraphics]# gdbserver 192.168.2.31:2345 lg
Process lg created; pid = 402
Listening on port 2345
@H_301_7@
@H_301_7@
切换到本机:
lxz@lxzlinux:~/lgraphics> ddd -debugger arm-linux-gdb lg
@H_301_7@
@H_301_7@
然后就会启动DDD的图形界面,在窗口下方有一个文本输入框,这里就是ddd的基础gdb的所在,在这里输入target remote 192.168.2.223:2345 lg,提示信息和我们用GDB时候是一样的。不同的是,除了这句连接目标机的指令,其他指令都不用输入了,可以在图形化界面里找到,这我就不说了。另外, 连接目标机的指令也可以用在DDD中设置,不用输入,可以查找其他介绍DDD使用的文章。下面是DDD的图形界面,工具栏下面的是watch,代码可以设 置断点(红色点),可以看到单步位置(绿色箭头),右边是执行控制工具条,最下面是GDB的输入和输出显示。
@H_301_7@
@H_301_7@
@H_301_7@
@H_301_7@
看到这里,想我一样的菜鸟们一定发现了,原来Linux程序可以这么好调啊,简直和CE没有什么差别了,呵呵。下面介绍为了使用GDB+DDD 所要做的东西。我不是从零开始建立的,具体的包依存关系我也不明白,只好假设你在安装Linux的时候已经安装了像GCC,DDD之类的工具。GDB的源 代码包gdb-6.6.tar.bz2可以从
ftp://gcc.gnu.org 上下载到,还有一个要求是你已经安装了交叉编译器arm-linux-gcc。
@H_301_7@
@H_301_7@
下载下来后:
@H_301_7@
# tar xvjf gdb-6.6.tar.bz2
@H_301_7@
# mkdir gdbbuild
@H_301_7@
# cd gdbbuild
@H_301_7@
# ../gdb-6.6/configure --target=arm-linux--prefix=/home/lxz/lxzgdb
@H_301_7@
@H_301_7@
这里,--prefix参数是需要安装的目录,然后
@H_301_7@
# make
@H_301_7@
# make install
@H_301_7@
这样,arm-linux-gdb这个工具就在/home/lxz/lxzgdb/bin里头了,你可以把这个路径添加到PATH里面去
@H_301_7@
@H_301_7@
接下来建立gdbserver,在gdbbuild的上一级目录下
@H_301_7@
# mkdir gdbserverbuild
@H_301_7@
# cd gdbserverbuild
@H_301_7@
# CC=arm-linux-gcc ../gdb-6.6/gdb/gdbserver/configure --host=arm-linux --prefix=/home/lxz/lxzgdbserver
@H_301_7@
@H_301_7@
一样,--prefix参数是需要安装的目录,然后
@H_301_7@
# make
@H_301_7@
# make install
@H_301_7@
@H_301_7@
有的文章里说,要去除arm-linux-strip的调试信息
@H_301_7@
# cd /home/lxz/lxzgdbserver/bin
@H_301_7@
# arm-linux-strip gdbserver
@H_301_7@
@H_301_7@
把这个gdbserver复制到你的开发板上,就OK了。
@H_301_7@
@H_301_7@
今天就写到这里。
原文链接:https://www.f2er.com/javaschema/287846.html