zoukankan      html  css  js  c++  java
  • 迅为i.MX6ULL开发板移植Gdb+Gdbserver调试

    因为有很多小伙伴是从单片机转过来的,用惯了单片机使用JLINk来调试程序,换到Linux非常不习惯。确实是如此,如果能在Linux上能设置断点,单步调试,查看变量,那就再好不过了。那么接下来将教大家怎么在arm板上调试应用代码的方法。
    首先,了解下基本的思路:
    采用这种方式进行远程调试,目标系统必须包括gdbserver程序,宿主机也必须安装gdb程序。一般Linux发行版中都有一个可以运行的gdb,但我们不能直接使用该发行版中的gdb来做远程调试,而要获取gdb的源代码包,针对arm平台做一个简单的配置,重新编译得到相应的gdb,如armv4.
    搭建环境
    UBuntu版本:Ubuntu 12.04
    交叉编译器:arm-2009q3.tar.bz2
    gdb版本:gdb-7.8.1.tar.gz
    开发板硬件:i.MX6ULL 终结者
    开发板系统:支持ssh的busybox
    注意事项:如果大家下载的gdb版本比较高,那么Ubuntu的GCC就必须用4.8以上的版本。交叉编译器要选择和自己编译的文件系统一致的编译器,因为busybox的根文件系统用的是arm-2009q3,所以这里编译gdb也使用这个编译
    搭建步骤
    (1)第一步:下载gdb压缩包
    下载地址:http://ftp.gnu.org/gnu/gdb/ 这里我们下载的是gdb-7.8.1.tar.gz这个版本。
    (2)第二步:编译并安装gdb
    把gdb压缩包放到ubuntu之后,我们进入到解压生成的文件,如图 1示:

    输入以下命令:
    ./configure -target=arm-none-linux-gnueabi --prefix=/home/topeet/arm-linux-gdb/arm-linux-gdb生成Makefile。target为目标平台,prefix为安装路径。

    生成Makefile成功如图 3所示:

    输入make,编译gdb,编译成功如图 4所示:

    输入make install ,安装gdb,一会我们在ubuntu上启动的就是这个gdb,安装成功如图 5所示:

    进入gdb源码下的gdb/gdbserver目录,如图 6所示:


    输入以下命令:
    ./configure -target=arm-none-linux-gnueabi --prefix=/home/topeet/arm-linux-gdb/arm-linux-gdbserver
    生成Makefile,target为目标平台,prefix为安装路径。

    然后执行make CC=/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-gcc命令,注意,这里交叉编译器一定要写绝对路径。
    编译过程中会出现图 8错误:

    我们打开gdb/gdbserver路径下的config.h文件,注释掉196行左右的HAVE_SYS_REG_H这个宏定义,然后保存退出。如图 9所示:

    打开gdb/gdbserver路径下的linux-x86-low.c的C文件,注释掉116行#include头文件,然后保存退出。如图 10所示:

    再次编译输入make CC=/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-gcc,编译成功如图 11所示:

    编译完成后,使用make install 命令安装,安装完成后会在安装路径生成一个文件夹,如图 12所示:

    第三步,在ARM板上搭建远程调试环境
    (1)把gdb/gdbserver下的gdbserver 拷贝到文件系统busybox的bin目录下,然后打包烧写生成的文件系统rootfs.tar.bz2
    (2)编写测试程序hello.c

    编译测试程序,编译的时候要加-g参数,编译完成之后,我们把测试代码通过SSH放在开发板上,然后再测试代码所在的路径下输入以下命令在目标板启动服务器,其中192.168.1.5为ubuntu的IP,8000为端口号。启动成功如图 14所示:

    再测试程序所在目录启动ubuntu上的gdb,这里启动的gdb为我们刚刚安装的gdb,我们输入以下命令:
    /home/topeet/arm-linux-gdb/arm-linux-gdb/bin/arm-none-linux-gnueabi-gdb hello

    启动成功后如图 15所示:

    连接开发板,输入以下命令,target remote 192.168.1.3:8000 192.168.1.3为开发板的IP,8000为端口号。

    连接成功后开发板会打印以下信息,如图 17所示:

    接下来,我们就可以在ubuntu上使用命令来设置断点,单步调试开发板上的程序了,L 是显示程序,b 7 是在第七行设置断点,info b 是查看断点,c 是运行。

    在串口控制台可以看到对应的打印信息

    打断点的方式主要有以下几种:
    break 函数名:在某个函数的入口处添加断点
    break 行号:在指定行添加断点
    break文件名:行号:在指定文件的指定行添加断点
    break行号 if 条件:当条件为真时,指定行号的断点生效。
    查看我们打的断点,使用命令info breakpoints,可以看见我刚才打的断点
    删除断点,使用命令delete断点编号来完成
    运行程序,输入命令run
     输入命令:print i,命令格式:print 变量名称。查看指定变量数值。
     我们也可以对变量i进行监控,可以输入命令 watch i,命令格式:watch 变量名称。对指定变量进行监控。.
    next:单步运行程序,不进入子函数。
    step:单步运行程序,进去子函数。
    如果我们想继续调试呢,可以输入命令continue
    退出调试。可以使用命令quit
    总结:
    上面的命令也可以使用简写,如break可以简写成b,简写表如下:

  • 相关阅读:
    MVC模式-----struts2框架(2)
    MVC模式-----struts2框架
    html的<h>标签
    jsp脚本元素
    LeetCode "Paint House"
    LeetCode "Longest Substring with At Most Two Distinct Characters"
    LeetCode "Graph Valid Tree"
    LeetCode "Shortest Word Distance"
    LeetCode "Verify Preorder Sequence in Binary Search Tree"
    LeetCode "Binary Tree Upside Down"
  • 原文地址:https://www.cnblogs.com/liyue3/p/14831138.html
Copyright © 2011-2022 走看看