主题 : 在mini2440上使用GDB远程调试 复制链接 | 浏览器收藏 | 打印
级别: 侠客
UID: 4162
精华: 2
发帖: 41
金钱: 320 两
威望: 122 点
贡献值: 11 点
综合积分: 122 分
注册时间: 2009-03-01
最后登录: 2015-09-12
楼主  发表于: 2009-04-01 14:03

 在mini2440上使用GDB远程调试

管理提醒: 本帖被 qq2440 执行取消置顶操作(2009-08-07)
哈哈,一直都没有发过有建设性的帖子,今次发个《在mini2440上使用GDB远程调试》,下面的东西虽算不上绝对原创,
但是经过我试验和总结的,用NFS作根文件系统配合GDB为我们的开发和学习提供了很大的便利,希望大家会喜欢!

1. 到http://www.gnu.org/software/gdb下载gdb-6.6.tar.gz到/tmp目录 
    
2. 解压到/opt目录下
#cd /opt
#tar xzvf /tmp/gdb-6.6.tar.gz

3. 建立配置文件、编译
gdb允许把编译配置和编译结果放到任意的目录,因此可以在gdb目录之外建立一个专门存放编译结果的目录。
#cd /opt
#mkdir -p arm-gdb/build
#cd arm-gdb/build
#/opt/gdb-6.6/configure --target=arm-linux --prefix=/opt/arm-gdb
#make
#make install

prefix指定了编译结果的存放位置,也就是安装目录。
如果在编译arm-linux-low.c这个文件时提示找不到“sys/reg.h”,则修改arm-linux-low.c,注释掉#include "sys/reg.h"。
编译完后可以在/opt/arm-gdb/bin目录下找到可执行的arm-linux -gdb, arm-linux -gdbtui, arm-linux-run。
拷贝arm-linux-gdb 到/usr/bin目录
#cd /opt/arm-gdb/bin/
#cp arm-linux-gdb /usr/bin/

4. gdbserver的移植
gdbserver要用到gdb源码目录下的一些头文件,因此无法在gdb源码目录之外编译文件。
#cd /opt/gdb-6.6/gdb/gdbserver
#./configure --host=arm-linux --target=arm-linux --prefix=/opt/arm-gdb/gdbserver
#make
#make install

注意:此处target参数和host参数都要设置为arm-linux,因为gdbserver是放在目标板上运行的。
编译后,可以在/opt/arm-gdb/gdbserver/bin目录下找到arm-linux-gdbserver,下载该文件到目标板的/usr/bin目录并重命名为gdbserver。
同时要下载gdbserver需要的库文件libthread_db-x.x.so(在交叉编译器的安装目录的lib子目录下可以找到)到目录板的/usr/lib目录,
再建立两个符号链接libthread_db.so和libthread_db.so.1。
在目标板上执行
#cd \usr\lib
#ln –s libthread_db-x.x.so libthread_db.so
#ln –s libthread_db-x.x.so libthread_db.so.1

5. 使用gdbserver
在目标板上运行gdbserver
在目标板上执行
#./gdbserver 192.168.0.2:2345 hello
其中192.168.0.2为目标板的IP。2345为gdbserver打开的端口,可以自己设置。

6. 运行gdb客户端
#./arm-linux-gdb hello
(gdb)target remote 192.168.0.2:2345
(gdb) list
1 #include <stdio.h>
2 #include <fcntl.h>
3
4 int main()
5 {
6 printf("hello world \n");
7 return 0;
8 }
(gdb)b main
(gdb)c

7. GDB的基本指令:
load:装入一个程序
symbol-file:装入符号库文件,可以是用-g参数编译的可执行文件。
f(ile):指定一个可执行文件进行调试,gdb将读取些文件的调试讯息,如f a.exe
l(ist):列程序出源文件
r(un) :装载完要调试的可执行文件后,可以用run命令运行可执行文件
b(reak):设置断点(break point),如b 25,则在源程序的第25行设置一个断点,当程序执行到第25行时,就会产生中断;也可以使用b funcname,funcname为函数的名称,
当程序调用些函数时,则产生中断
c(ontinue):c命令可以另中断的程序继续执行,直到下一个中断点或程序结束
p(rint):输入某个变量的值,如程序定义了一个int aa的就是,p aa就会输出aa的当前值
n(ext):程序执行到断点时中断执行,可以用n指令进行单步执行
s(tep):程序执行到断点时中断执行,可以用s指令进行单步执行进某一函数
q(uit):退出GDB

我的虚拟机的Linux被我不小心搞掉了,所以生成的文件都没了,暂时不能提供给大家,希望大家能按上面的步骤做一次,好运!
[ 此帖被风城少主在2009-06-01 00:24重新编辑 ]
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
贡献值: 71 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
1楼  发表于: 2009-04-01 23:01
支持使用Open Source工具debug
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
贡献值: 71 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
2楼  发表于: 2009-04-01 23:03
不过建议你换个更贴切的名字,比如“在mini2440上使用GDB远程调试”
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
贡献值: 71 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
3楼  发表于: 2009-04-07 10:20

 回 6楼(vincentche) 的帖子

是的,如果你想要调试内核, 可以用gdb远程调试 + kgdb
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
贡献值: 71 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
4楼  发表于: 2009-11-21 20:27

 回 12楼(caai) 的帖子

别人分享的是方法和概念,每个人的具体情况都不同,当然不能生搬硬套。如果你觉得哪里有问题,大可以提出来讨论。
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
贡献值: 71 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
5楼  发表于: 2010-04-20 14:06
warning: Unable to find dynamic linker breakpoint function.
GDB will be unable to debug shared library initializers
and track explicitly loaded dynamic code.

这是可以接受的

然后一设置断点就会跳出来,有没有人能解决啊????

这个要看你是怎么做的,又是怎么跳出来的了
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."