1、調(diào)試原理
GDB調(diào)試是應(yīng)用程序在開發(fā)板上運行,然后在PC機(jī)上對開發(fā)板上得應(yīng)用程序進(jìn)行調(diào)試,PC機(jī)運行GDB,開發(fā)板上運行GDBServer。在應(yīng)用程序調(diào)試的時候,pc機(jī)上的gdb向開發(fā)板上的GDBServer發(fā)出命令,而開發(fā)板上的gdbserver就會向應(yīng)用程序發(fā)出信號,使應(yīng)用程序停下來或者完成其他一些工作。
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的時候會出現(xiàn)以下錯誤
該錯誤是因為找不到PTRACE_GETSIGINFO宏,導(dǎo)致編譯錯誤。我們到交叉編譯鏈去搜索一下,我們交叉編譯地址為 /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拷貝到開發(fā)板的bin目錄下
#cp gdbserver /work/nfs_root/first_fs/bin
3、調(diào)試
3.1、在編譯要進(jìn)行調(diào)試的應(yīng)用程序 加上 -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 ”, a);
A(p); // A 》 B 》 C
return 0;
}
編譯:
#arm-linux-gcc -g -o test_debug test_debug.c
3.2、在開發(fā)板上:
打印出如下信息:
#gdbserver 192.168.1.10:123 。/test_debugProcess 。/test_debug created; pid = 751
Listening on port 2345
注釋:192.168.1.10:本開發(fā)板的ip
123:端口號,自己隨便寫的
/test_debug:要調(diào)試的程序
3.3、在PC上輸入:
/bin/arm-linux-gdb 。/test-debug
target remote 192.168.183.127:2345
3.4、正式調(diào)試!介紹幾個常用的命令
(1)l:列出所有源代碼
(2)break main:在main處打斷點
break test_debug.c:11:在test_debug.c的11行打斷點
(3)c:運行到斷點處
(4)step:單步執(zhí)行
(5)next:單步執(zhí)行,但是step會進(jìn)入函數(shù)里面,但是next不會
(6)print a:打印a這個變量的值
(7)quit:退出,輸入此命令則開發(fā)板上的gdbserver也退出
(8) 詳細(xì)的GDB調(diào)試命令
4、另外一種調(diào)試方法
讓程序在開發(fā)板上直接運行,當(dāng)它發(fā)生錯誤時,令它產(chǎn)生core dump文件,然后使用gdb根據(jù)core dump文件找到發(fā)生錯誤的地方
在ARM板上:
4.1、 ulimit -c unlimited
4.2、 執(zhí)行應(yīng)用程序 : 程序出錯時會在當(dāng)前目錄下生成名為core的文件
在PC上:
4.3、首先將core文件拷貝到pc機(jī)上
然后:/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:可以顯示調(diào)用關(guān)系
#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
責(zé)任編輯:gt
評論