3、配置:cd gdb-7.4/
./configure --target=arm-linux
4、编译:make
5、安装:mkdir tmp
make install prefix=$PWD/tmp
6、拷贝:cp tmp/bin/arm-linux-gdb /bin/
7、查看版本 /bin/arm-linux-gdb -v (使用绝对路径使用gdb)
2.2、GDBServer
1、cd gdb/gdbserver/
2、配置: ./configure --target=arm-linux --host=arm-linux
3、编译: make CC=arm-linux-gcc
2.3、编译GDBServer的时候会出现以下错误
linux-arm-low.c: In function `arm_stopped_by_watchpoint': linux-arm-low.c:642: error: `PTRACE_GETSIGINFO' undeclared (first use in this function) linux-arm-low.c:642: error: (Each undeclared identifier is reported only once linux-arm-low.c:642: error: for each function it appears in.)
该错误是因为找不到PTRACE_GETSIGINFO宏,导致编译错误。我们到交叉编译链去搜索一下,我们交叉编译地址为 /work/tools/gcc-3.4.5-glibc-2.3.6
# cd /work/tools/gcc-3.4.5-glibc-2.3.6 # grep "PTRACE_GETSIGINFO" * -nR arm-linux/sys-include/linux/ptrace.h:27:#define PTRACE_GETSIGINFO 0x4202 arm-linux/include/linux/ptrace.h:27:#define PTRACE_GETSIGINFO 0x4202 distributed/arm-linux/sys-include/linux/ptrace.h:27:#define PTRACE_GETSIGINFO 0x4202 distributed/arm-linux/include/linux/ptrace.h:27:#define PTRACE_GETSIGINFO 0x4202
可以看到,在交叉编译链里面,定义了PTRACE_GETSIGINFO宏为0x4202,头文件为include<linux/ptrace.h>中。
有两种解决办法,可任选其一:
① 在linux-arm-low.c中直接添加宏 #define PTRACE_GETSIGINFO 0x4202
② 在linux-arm-low.c中将#include <sys/ptrace.h> 更改为 #include <linux/ptrace.h>
再次编译,编译通过。
2.4、将gdbserver拷贝到开发板的bin目录下#cp gdbserver /work/nfs_root/first_fs/bin
3、调试3.1、在编译要进行调试的应用程序 加上 -g
测试程序如下(test_debug.c)
#include <stdio.h> void C(int *p) { *p = 0x12; } void B(int *p) { C(p); } void A(int *p) { B(p); } void A2(int *p) { C(p); } int main(int argc, char **argv) { int a; int *p = NULL; A2(&a); // A2 > C printf("a = 0x%x\n", a); A(p); // A > B > C return 0; }
编译:
#arm-linux-gcc -g -o test_debug test_debug.c
3.2、在开发板上: 打印出如下信息:
#gdbserver 192.168.1.10:123 ./test_debug
Process ./test_debug created; pid = 751
Listening on port 2345
注释:192.168.1.10:本开发板的ip
123:端口号,自己随便写的
./test_debug:要调试的程序
3.3、在PC上输入:
/bin/arm-linux-gdb ./test-debug target remote 192.168.183.127:2345
3.4、正式调试!介绍几个常用的命令(1)l:列出所有源代码
(2)break main:在main处打断点
break test_debug.c:11:在test_debug.c的11行打断点
(3)c:运行到断点处
(4)step:单步执行
(5)next:单步执行,但是step会进入函数里面,但是next不会
(6)print a:打印a这个变量的值
(7)quit:退出,输入此命令则开发板上的gdbserver也退出
(8) 详细的GDB调试命令
4、另外一种调试方法让程序在开发板上直接运行,当它发生错误时,令它产生core dump文件,然后使用gdb根据core dump文件找到发生错误的地方