1、调试原理
GDB调试是运用程序在开发板上运转,然后在PC机上对开发板上得运用程序进行调试,PC机运转GDB,开发板上运转GDBServer。在运用程序调试的时分,pc机上的gdb向开发板上的GDBServer宣布指令,而开发板上的gdbserver就会向运用程序宣布信号,使运用程序停下来或许完结其他一些作业。
2、装置GDB和GDBServer(gdb-7.4.tar.bz2 )
2.1、GDB
1、下载: http://ftp.gnu.org/gnu/gdb/
2、解压:tar xvf gdb-7.4.tar.bz2
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的时分会出现以下过错
该过错是因为找不到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_debugProcess 。/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文件找到产生过错的当地
在ARM板上:
4.1、 ulimit -c unlimited
4.2、 履行运用程序 : 程序犯错时会在当时目录下生成名为core的文件
在PC上:
4.3、首先将core文件复制到pc机上
然后:/bin/arm-linux-gdb 。/test_debug 。/core
打印出如下信息:
GNU gdb (GDB) 7.4
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 《http://gnu.org/licenses/gpl.html》
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type “show copying”
and “show warranty” for details.
This GDB was configured as “–host=i686-pc-linux-gnu –target=arm-linux”。
For bug reporTIng instrucTIons, please see:
《http://www.gnu.org/software/gdb/bugs/》。..
Reading symbols from /home/share/jz2440/test_debug.。.done.
[New LWP 748]
warning: `/lib/libc.so.6‘: Shared library architecture unknown is not compaTIble with target architecture arm.
warning: `/lib/ld-linux.so.2’: Shared library architecture unknown is not compaTIble with target architecture arm.
Core was generated by `。/test_debug‘。
Program terminated with signal 11, Segmentation fault.
#0 0x000084ac in C (p=0x0) at test_debug.c:6
6 *p = 0x12;
4.4、bt:能够显现调用联系
#0 0x000084ac in C (p=0x0) at test_debug.c:6
#1 0x000084d0 in B (p=0x0) at test_debug.c:12
#2 0x000084f0 in A (p=0x0) at test_debug.c:17
#3 0x00008554 in main (argc=1, argv=0xbeb32eb4) at test_debug.c:34
责任编辑:gt