zoukankan      html  css  js  c++  java
  • Linux嵌入式GDB调试环境搭建

    ======================= 我的环境 ==========================
    PC 端: CPU:x86_64, 系统:Ubuntu,IP:172.16.2.212
    开发板:CPU:sw9820c,系统:openwrt linux,IP:172.16.30.20
    PC端安装的 C 交叉编译器为 arm-none-linux-gnueabi-gcc(gcc version 4.6.3),即交叉编译工具链的前缀为 arm-none-linux-gnueabi。
    ===========================================================

    1、GDB调试方式说明

      一般桌面系统如Ubuntu、Centos等可以直接运行gdb + 目标可执行程序, 而嵌入式系统则分情况, 如果性能强劲且调试的源码文件比较少, 也可以编译嵌入式版的gdb执行文件, 即嵌入式gdb + 目标可执行程序。

    如果性能弱或者调试对象的源码文件多可采用分离法, 即PC端运行gdb, 同时源码也在PC端, 而目标可执行程序放到开发板, 那怎么联系呢, 所以开发板端还需要运行gdbserver, 与PC端的gdb通过网络通信。

    PC端也称客户端, 开发板端为服务端,  gdbserver 接收 gdb 所传送的命令(list, step等), 然后调度执行文件, 并把相关信息反馈给PC端, PC端解析后查询源码文件并显示到控制台。

      注意,gdb调试除了可执行文件外还需要源码! 而我的源码文件比较多, 所以采用后者即 gdb + gdbserver。 在介绍安装前, 请确保宿主机和目标机可以相互ping通且可以telnet访问端口, 因为两者是靠网络通信的!

         

    2、安装

     a. 下载gdb

      ftp://ftp.gnu.org/gnu/gdb , 我选择的是 gdb-6.8a.tar.bz2 

     b. 解压编译

    tar jxvf gdb-6.8a.tar.bz2
    
    //编译PC端 gdb
    cd gdb-6.8/
    mkdir _install
    ./configure --target=arm-none-linux-gnueabi --disable-werror --prefix=/home/fuzk/tools/gdb/gdb-6.8/_install  //没有设置host 默认= x86_64
    make
    make install
    
    //编译开发板端 gdbserver
    cd gdb-6.8/gdb/gdbserver
    ./configure --host=arm-none-linux-gnueabi
    make //当前路径就有gdbserver

    3、测试

      首先编写测试用例:

    #include <stdio.h>
    
    void debug(char *str)
    {
        printf("debug info :%s
    ",str );
    }
    
    main(int argc,char *argv[])
    {
        int i,j;
        j=0;
        for(i=0;i<10;i++){
            j+=5;
            printf("now a=%d
    ", j);
        }
    }

      arm-none-linux-gnueabi-gcc -g test.c 生成a.out可执行文件, 连同 gdb-6.8/gdb/gdbserver/gdbserver  一并拷贝到开发板, 然后运行

      当然也可以指定允许哪个IP地址访问, 比如我的PC 172.16.2.212  访问开发板

      PC端把可执行文件和源码拷贝到gdb-6.8/_install/bin下,

       运行gdb:

    fuzk@ubuntu:~/tools/gdb/gdb-6.8/_install/bin$ ./arm-none-linux-gnueabi-gdb
    GNU gdb 6.8
    Copyright (C) 2008 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=x86_64-unknown-linux-gnu --target=arm-none-linux-gnueabi".
    (gdb) target remote 172.16.30.20:777  重中之重!
    Remote debugging using 172.16.30.20:777
    [New Thread 319]
    0xb6efced0 in ?? ()
    (gdb) b main
    No symbol table is loaded.  Use the "file" command.
    (gdb) file a.out 
    A program is being debugged already.
    Are you sure you want to change the file? (y or n) y
    Reading symbols from /home/fuzk/tools/gdb/gdb-6.8/_install/bin/a.out...done.
    (gdb) b main
    Breakpoint 1 at 0x846c: file test.c, line 11.
    (gdb) c
    Continuing.
    
    Breakpoint 1, main (argc=1, argv=0xbe8d4e54) at test.c:11
    11          j=0;
    (gdb) n
    12          for(i=0;i<10;i++){
    (gdb) n                  这里发生异常, 直接执行完, 同时开发板也打印全部, 猜测是版本问题
    
    Program exited with code 012.
    (gdb) 


    开发板log:

    /data/app/MAINAPP/data # ./gdbserver 172.16.2.212:777 /data/a.out
    [ 7431.399932] c0 init: untracked pid 318 exited
    Process /data/a.out created; pid = 319
    Listening on port 777
    Remote debugging from host 172.16.2.212
    now a=5

    
    

    now a=10

    
    

    now a=15

    
    

    now a=20

    
    

    now a=25

    
    

    now a=30

    
    

    now a=35

    
    

    now a=40

    
    

    now a=45

    
    

    now a=50

    
    


    Child exited with retcode = a

    
    

    Child exited with status 10
    GDBserver exiting

     

      gdb-6.8的PC端gdb貌似有问题, 无法全部单步调试, 我的交叉编译器是arm-none-linux-gnueabi-gcc, 同时也提供了arm-none-linux-gnueabi-gdb, 发现调试正常, 跟我自己编译的区别在于版本是7.2, 所以应该是版本问题, 后续用系统自带的

    其log如下:

    fuzk@ubuntu:~/test/gdb/simple$ arm-none-linux-gnueabi-gdb
    GNU gdb (Sourcery CodeBench Lite 2012.03-57) 7.2.50.20100908-cvs
    Copyright (C) 2010 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-none-linux-gnueabi".
    For bug reporting instructions, please see:
    <https://support.codesourcery.com/GNUToolchain/>.
    (gdb) target remote 172.16.30.20:777
    Remote debugging using 172.16.30.20:777
    0xb6ed7ed0 in ?? ()
    (gdb) b main
    No symbol table is loaded.  Use the "file" command.
    Make breakpoint pending on future shared library load? (y or [n]) y
    Breakpoint 1 (main) pending.
    (gdb) b main
    No symbol table is loaded.  Use the "file" command.
    Make breakpoint pending on future shared library load? (y or [n]) y
    Breakpoint 2 (main) pending.
    (gdb) file a.out 
    A program is being debugged already.
    Are you sure you want to change the file? (y or n) y
    Reading symbols from /home/fuzk/test/gdb/simple/a.out...done.
    Cannot access memory at address 0x0
    (gdb) b main
    Cannot access memory at address 0x0
    Note: breakpoints 1 and 2 also set at pc 0x846c.
    Breakpoint 3 at 0x846c: file test.c, line 11.
    (gdb) c
    Continuing.
    
    Breakpoint 1, main (argc=1, argv=0xbe9bbe54) at test.c:11
    11          j=0;
    (gdb) s
    12          for(i=0;i<10;i++){
    (gdb) s
    13              j+=5;
    (gdb) s
    14              printf("now a=%d
    ", j);
    (gdb) n
    12          for(i=0;i<10;i++){
    (gdb) s
    13              j+=5;
    (gdb) s
    14              printf("now a=%d
    ", j);
    (gdb) n
    12          for(i=0;i<10;i++){
    (gdb) n
    13              j+=5;
    (gdb) n
    14              printf("now a=%d
    ", j);
    (gdb) n
    12          for(i=0;i<10;i++){
    (gdb) n
    13              j+=5;
    (gdb) n
    14              printf("now a=%d
    ", j);
    (gdb)

    (gdb) s
    12 for(i=0;i<10;i++){
    (gdb) s
    13 j+=5;
    (gdb) s  printf由于没有-g编译 调用step会导致异常, 所以建议使用next, 但如果用系统自带的会有上面红色提示 所以用step也不怕!
    14 printf("now a=%d ", j);
    (gdb) s
    12 for(i=0;i<10;i++){
    (gdb) s
    13 j+=5;
    (gdb) s
    14 printf("now a=%d ", j);

    =====================
    对应开发板:
    /data/app/MAINAPP/data # ./gdbserver 172.16.2.212:777 /data/a.out
    [ 8046.924774] c0 init: untracked pid 326 exited
    Process /data/a.out created; pid = 327
    Listening on port 777
    Remote debugging from host 172.16.2.212
    now a=5
    now a=10
    
    now a=15

    now a=20

    
    

    now a=25

     

     4. 其他

    igure: error: no termcap library found

      Makefile:10927: recipe for target 'configure-gdb' failed
      make[1]: *** [configure-gdb] Error 1
      make[1]: Leaving directory '/home/fuzk/tools/gdb/gdb-7.2'

     缺少 termcap库, 先安装该库: https://ftp.gnu.org/gnu/termcap/

          tar zxvf termcap-1.3.1.tar.gz

          cd termcap-1.3.1/

          ./configure --prefix=/home/fuzk/tools/gdb/gdb-7.2/_install --target=arm-none-linux-gnueabi

          vi Makefile :     

            CC = /opt/toolchain/arm-2012.03/bin/arm-none-linux-gnueabi-gcc
            AR = /opt/toolchain/arm-2012.03/bin/arm-none-linux-gnueabi-ar

          make install

      重初始化: 

      CFLAGS=-I/home/fuzk/tools/gdb/gdb-7.2/_install/include LDFLAGS=-L/home/fuzk/tools/gdb/gdb-7.2/_install/lib ./configure --prefix=/home/fuzk/tools/gdb/gdb-7.2/_install --target=arm-none-linux-gnueabi --host=arm-none-linux-gnueabi

      make  

      make install

  • 相关阅读:
    java中的“指针”
    UEditor1.4.3.3编辑器漏洞
    csrf攻击实例
    shiro java 反序列漏洞复现
    渗透面试问题
    了解 OWASP TOP 10
    网络基础知识回顾
    cs(cobalt strike)的使用
    解决docker-valhub漏洞环境下载慢的问题
    Vulhub漏洞CVE-2017-10271复现
  • 原文地址:https://www.cnblogs.com/vedic/p/11104204.html
Copyright © 2011-2022 走看看