Linux应用调试技术之GDB和GDBServer

    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文件找到发生错误的地方

 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/59a29d7b60ad06ef75eb831bdc25eaea.html