the method gdb+gdb server install

https://www.cnblogs.com/veryStrong/p/6240769.htmlhtml

一、調試原理

  GDB調試是應用程序在開發板上運行,而後在PC機上對開發板上得應用程序進行調試,PC機運行GDB,開發板上運行GDBServer。在應用程序調試的時候,pc機上的gdb向開發板上的GDBServer發出命令,而開發板上的gdbserver就會嚮應用程序發出信號,使應用程序停下來或者完成其餘一些工做。linux

 

二、安裝GDB和GDBServer(gdb-7.4.tar.bz2 )redis

  2.一、GDB  app

    一、下載: http://ftp.gnu.org/gnu/gdb/ ide

    二、解壓:tar xvf gdb-7.4.tar.bz2函數

    三、配置:cd gdb-7.4/測試

                ./configure --target=arm-linuxui

    四、編譯:makethis

    五、安裝:mkdir tmp spa

                make install prefix=$PWD/tmp

    六、拷貝:cp tmp/bin/arm-linux-gdb  /bin/

    七、查看版本 /bin/arm-linux-gdb -v (使用絕對路徑使用gdb)

  2.二、GDBServer

    一、cd gdb/gdbserver/

    二、配置: ./configure --target=arm-linux --host=arm-linux

    三、編譯: make CC=arm-linux-gcc

 

  2.三、編譯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.四、將gdbserver拷貝到開發板的bin目錄下

#cp gdbserver /work/nfs_root/first_fs/bin

 

 三、調試

  3.一、在編譯要進行調試的應用程序 加上 -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.二、在開發板上:

  打印出以下信息:

#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.三、在PC上輸入:

    /bin/arm-linux-gdb ./test-debug
           target remote 192.168.183.127:2345

3.四、正式調試!介紹幾個經常使用的命令

  (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調試命令

四、另一種調試方法

  讓程序在開發板上直接運行,當它發生錯誤時,令它產生core dump文件,而後使用gdb根據core dump文件找到發生錯誤的地方

 

  在ARM板上:
  4.一、 ulimit -c unlimited
  4.二、 執行應用程序 : 程序出錯時會在當前目錄下生成名爲core的文件

 

  在PC上:

  4.三、首先將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.四、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
相關文章
相關標籤/搜索