zoukankan      html  css  js  c++  java
  • GDB在ARM板中的应用

    GDB的下载:

    http://www.gnu.org/software/gdb/

    下载gdb-7.4.tar.bz2

    1.解压: tar xjf gdb-7.4.tar.bz2

    2.编译gdb和gdbserver

    2.1   编译gdb:

       cd gdb-7.4/

      .configure -- target=arm-linux  //配置

       make //编译

       make install //安装,注意如果直接运行make install的话,直接撞到pc机的usr/bin中去了。我不想这么直接安装,想看看安装时生成什么东西?

       vi makefile,然后搜索prefix,这prefix就是指代安装的路径。因此我可以自定义我的安装路径

       mkdir tmp

       make install prefix = $PWD / tmp

       此时可以去tmp目录下,看一下都生成了什么东西。你会看到有bin  include   lib   share目录。进入bin目录,你会看到arm-linux-gdb的程序。

    2.2  编译gdbserver

      cd gdb / gdbserver

      .configure  --host = arm-linux

       make

       编译的过程中会出现错误:PTRACE GETSIGINFO没有定义。-I表示头文件在哪里。在-I指定的头文件中没有所需要的头文件,怎么板呢?

      注意:头文件除了在-I指定的目录里找,还去交叉编译工具链里面找,交叉编译工具链在哪呢?

      echo $PATH

      cd /tools/gcc-3.4.5-glibc-2.3.6/bin

      grep "PTRACE_GETSIGINFO"  * -nR,搜索后发现,该宏在arm-linux/inluce/linux / ptrace.h中已经定义了,那为什么提示没有定义呢?

      打开出错的文件:linux-arm-low.c,发现它包含的是include <sys/ptrace.h>,因此我们修改为 #include <linux / ptrace.h>

      此时再进行编译,就不会有任何问题了。最终生成gdbserver

    3.  在开发板中使用GDB的原理

      

     在PC机里编译APP程序,然后在PC机里进行调试,此时我们使用的工具是gdb

     我们把编译好的APP文件拷贝到ARM板上,因为这个程序是运行在ARM板上。

     我们在PC机里如何去调试在ARM板中运行的程序呢?带着这个问题,一步步的向下走。

    在PC机上,gdb发出的命令给谁呢?比如说,设一个断点,它会不会直接给ARM板上的APP程序。答案显然不会的,此时gdb_server就要出场了,这个gdb_server就是APP的父进程。在PC机上运行的gdb发出命令给gdb server,比如说想让APP这个程序停止,此时就发送命令给gdb server,gdb server收到命令后,就给子进程(APP程序)发一个信号,让该程序停止下来。

    举个例子:gdb去读APP中的变量a

    gdb会从带有调试信息的文件中确定a变量的地址,然后发送命令给gdb server,gdb server再去访问APP的内存空间。

    编译要调试的应用程序,编译时加上-g选项: arm-linux-gcc -g -o test_debug test_debug.c,把编译出来的test_debug拷贝到开发板上。

    调试:

    (1)在ARM板上

    gdbserver  192.168.1.17 : 端口   ./test_debug

    注意:此IP地址为ARM的ip地址,从这里可以看出,在使用之前,需要确保arm板和PC机必须ping的通。

    端口可以随便写,在这里取2345

    (2)在PC机上

    arm-linux-gdb  ./test_debug

    (gdb) target remote 192.168.1.17 : 2345 (建立PC和开发板的连接)

    (gdb) l

    你会看到接下来的使用方式和前几篇博客中介绍的gdb的使用方法完全相同了

    法2:让程序在开发板上直接运行,当它产生错误时,令它产生core dump文件,将此文件拷贝到pc机上,在PC机上使用gdb,根据core dump文件找到程序发生错误的地方。

    (1)ulimit -c unlimited

    (2)在开发板上执行应用程序,程序出错时会在当前目录下生成名为core的文件

    ./test_debug    (假设这个应用程序有问题)

    执行后,会出现Segmentation fault (core dump)

    注意这是在开发板上得到的core dump文件,需要将它拷到PC机上。

    (3)在PC机上执行:

    arm-linux-gdb  ./test_dubug  ./core

    在这里你会看到又进入了(gdb)调试的界面了。

    总结:

    在嵌入式开发中,我们肯定会去调试在ARM板中运行的程序,本篇博客就简单的介绍了如何调试在开发板上运行的程序。在搭建好环境后,还是会回到gdb调试程序的界面,这个界面就和之前的gdb使用方法完全一样了,因此想要高效的调试嵌入式程序,熟练掌握gdb的基本使用方法是关键。

      

       

      

  • 相关阅读:
    CF949C Data Center Maintenance 题解
    P1438 无聊的数列 题解
    CF620E New Year Tree 题解
    结构体优先队列的定义
    CF464E The Classic Problem 题解
    CF427C Checkposts
    CF161D Distance in Tree 题解
    P4375 [USACO18OPEN]Out of Sorts G 题解
    SCI, SCIE, 和ESCI的区别
    Matlab画图中图的方法
  • 原文地址:https://www.cnblogs.com/-glb/p/12563700.html
Copyright © 2011-2022 走看看