建立ARM平台上的交叉调试器gdb和gdbserver

发布者:Lihua1314520最新更新时间:2016-08-06 来源: eefocus关键字:ARM平台  交叉调试器  gdb  gdbserver 手机看文章 扫描二维码
随时随地手机看文章
(有的时候执行环境的权限真的是很重要的)

gdb-6.6使用了autoconf/automake,因此通过设置configure脚本的--target,--host,--prefix参数就可以方便的移植到别的平台。

--target 指定编译后的文件针对的是什么目标板,一般设置为交叉编译器的前缀,比如--target=arm-linux, --target=mips-linux,--target=armv5-linux-uclibc, --target的缺省值为i386-linux, 也就是PC机。

--host 指定编译后的文件的运行环境,取值可以是i386-linux或者交叉编译器的前缀,缺省为i386-linux,

--prefix 指定要安装的目录。

1、到http://www.gnu.org/software/gdb下载gdb-6.6.tar.gz到/tmp解压到/opt下
   #cd /opt
   #tar xzvf /tmp/gdb-6.6.tar.gz

2、建立配置文件、编译
   gdb允许把编译配置和编译结果放到任意的目录,因此可以在gdb目录之外建立一个专门放编译文件的目录。
   #cd /opt
   #mkdir -p arm-gdb/build
   #cd arm-gdb/build

   #/opt/gdb-6.6/configure --host=i386-linux --target=armv5-linux-uclibc --prefix=/opt/arm-gdb
   #make
   #make install
其中:host指定了运行环境为i386机器,target指定了需要调试的目标机环境(我使用的ARM toolchain是armv5-linux-uclibc-gcc,因此这样指定,如果是用arm-linux-gcc,则 --target=arm-linux),prefix指定了编译后的结果存放的位置,也就是安装目录。
   如果在编译arm-linux-low.c这个文件时提示找不到“sys/reg.h”, 则修改arm-linux-low.c,注释掉#include "sys/reg.h"。

    可以在/opt/arm-gdb/bin下找到可执行的armv5-linux-uclibc-gdb, armv5-linux-uclibc-gdbtui, armv5-linux-uclibc-run。

3、gdbserver的移植
   gdbserver要用到gdb源码目录下的一些头文件,因此无法在gdb源码目录之外建立编译文件。
 
   #cd /opt/gdb-6.6/gdb/gdbserver
   #vi build.arm         
   内容如下:
      ./configure --target=armv5-linux-uclibc --host=armv5-linux-uclibc --prefix=/opt/arm-gdb/gdbserver
      make
      make install
   #chmod +x build.arm
   #./build.arm

   注意:此处target参数和host参数都要设置为armv5-linux-uclibc,因为gdbserver是放在目标板上运行的。
   编译后,可以在/opt/arm-gdb/gdbserver/bin下找到armv5-linux-uclibc-gdbserver,下载该文件到目标板并重命名为gdbserver,
   同时要下载gdbserver需要的库文件libthread_db-x.x.x.so,再建立两个符号链接libthread_db.so和libthread_db.so.1。
   
   
4、使用gdbserver
   在目标板上运行gdbserver
   #./gdbserver 192.168.0.2:2345 hello
  
   其中192.168.0.2为目标板的IP,可以写localhost,也可以不写。2345为gdbserver打开的端口,可以自己设置。
   #./gdbserver :2345 hello
 
   在宿主机上运行
   #armv5-linux-uclibc-gdb hello
   (gdb)target remote 192.168.0.2:2345
   (gdb)b main
   (gdb)continue

   使用X-Windows下的DDD
   #ddd --debugger armv5-linux-uclibc-gdb

   在DDD的GDB终端控制窗口中健入: 
   (gdb) target 192.168.0.2:2345

6、问题
   移植的gdbserver可以和Host上的mips-linux-gdb连接上,但是run的时候gdbserver出现
   Killing inferior错误
   解决方法:因为执行完target命令后,目标板程序已经在运行,所有应该用continue命令而不是run命令。


7、附1:GDB的基本指令:

   load:装入一个程序
   symbol-file:装入符号库文件,可以是用-g参数编译的可执行文件。
   f(ile):指定一个可执行文件进行调试,gdb将读取些文件的调试讯息,如f a.exe
   l(ist):列程序出源文件
   r(un) :装载完要调试的可执行文件后,可以用run命令运行可执行文件
   b(reak):设置断点(break point),如b 25,则在源程序的第25行设置一个断点,当程序执行到第25行时,就会产生中断;也可以使用b funcname,funcname为函数的名称,

当程序调用些函数时,则产生中断
   c(ontinue):c命令可以另中断的程序继续执行,直到下一个中断点或程序结束
   p(rint):输入某个变量的值,如程序定义了一个int aa的就是,p aa就会输出aa的当前值
   n(ext):程序执行到断点时中断执行,可以用n指令进行单步执行
   s(tep):程序执行到断点时中断执行,可以用s指令进行单步执行进某一函数
   q(uit):退出GDB

8、附2:调试驱动程序和共享库

  (1)调试LKM(Loadable Kernel Module)
  .在目标板上插入模块并输出map信息,查看.text入口地址:
   #insmod -m hello.ko > map
   #grep .text map  
             比如为0xc68c0060
  .在gdb中转入LKM的调试信息:
   (gdb) add-symbol-file hello.ko 0xc68c0060  /*注意必须是LKM .text的入口地址)
  .正常调试

  (2)调试共享库
    .样例程序:  
    test.c:
    #include
    int test(int a, int b)
    {
    int s = a b;
    printf("%d\n", s);
    return s;
    }

    main.c:
    #include
    extern int test(int a, int b);
    int main(int argc, char* argv[])
    {
    int s = test(10, 20);
    return s;
    }

    Makefile:
    all: so main
    so:
    armv5-linux-uclibc-gcc -g test.c -shared -o libtest.so
    main:
    armv5-linux-uclibc-gcc -g main.c -L./ -ltest -o test.exe
    clean:
    rm -f *.exe *.so
    
    .编译并设置环境变量
 #make

        在目标板上:
 #export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./
 #gdbserver localhost:2345 ./test.exe

    .运行gdb客户端
 #armv5-linux-uclibc-gdb
 (gdb)symbol-file test.exe
 (gdb)target remote 192.168.0.2:2345
 (gdb)b main
 (gdb)c

    .查看libtest.so的代码在内存中的位置。
     (从gdbserver的输出或者用ps可以得到test.exe的进程ID,这里假设PID是11547)
     在目标板上:
      #cat /proc/11547/maps
 输出:

.........
 0076a000-0076c000 rwxp 0076a000 00:00 0 
 00bbe000-00bbf000 r-xp 00bbe000 00:00 0 
 00fcc000-00fcd000 r-xp 00000000 03:01 1238761 /root/test/gdbservertest/libtest.so
 00fcd000-00fce000 rwxp 00000000 03:01 1238761 /root/test/gdbservertest/libtest.so
 08048000-08049000 r-xp 00000000 03:01 1238765 /root/test/gdbservertest/test.exe
 08049000-0804a000 rw-p 00000000 03:01 1238765 /root/test/gdbservertest/test.exe
 ........
 
 由此可以知道:libtest.so的代码在00fcc000-00fcd000之间。

    .查看libtest.so的.text段在内存中的偏移位置:
        armv5-linux-uclibc-objdump -h libtest.so |grep .text
 输出:
   .text 00000130 00000450 00000450 00000450 2**4
        即偏移位置为0x00000450

    .回到板子上的gdb窗口,加载libtest.so的符号表。
 (gdb)add-symbol-file libtest.so 0x00fcc450
  (这里0x00fcc450 = 0x00fcc000 0x00000450)

    .在共享库的函数中设置断点
 (gdb)b test

    .继续调试共享库

关键字:ARM平台  交叉调试器  gdb  gdbserver 引用地址:建立ARM平台上的交叉调试器gdb和gdbserver

上一篇:关于LPC2103外部中断
下一篇:ARM 汇编命令参考AREA

推荐阅读最新更新时间:2024-03-16 15:04

基于ARM-Linux平台的电子油门控制
引言 巡航控制系统(CCS)是20世纪60年代发展起来的,又称为恒速行驶系统。巡航控制系统工作时,ECU根据各种传感器输送来的信号判断汽车的运行状况,通过执行元件自动调节节气门的开度使汽车的行驶速度与设定的车速保持一致。汽车在良好路面上长时间行驶时,驾驶员启动巡航控制系统并设定行驶速度,不需驾驶员操纵加速踏板,通过巡航控制系统即可自动保持既定的行驶速度,不仅减轻了驾驶员的劳动强度,同时利用先进的电子控制技术控制节气门的开度,比驾驶员操纵节气门更精确,汽车燃料经济性、排放污染性也可得到改善。 1 系统原理 1.1 电控油门原理 工作时,由驾驶员发出转速的控制指令,由节气门开度传感器采集发动机的转速参数,并把信号输入电控单元;电控单
[单片机]
重庆渝北区建立“ARM架构集成电路产业支持平台
2016年10月19日,重庆讯 中国重庆渝北区仙桃数据谷近日建立 ARM架构集成电路产业支持平台 ,该平台将为在重庆渝北区落户的IC设计企业提供ARM IP购买、技术服务、设计工具、培训等全方位支持。 该平台的建立将直接推动重庆本地以IC设计为代表的电子产业创新项目发展,凡在重庆仙桃数据谷落地的电子与集成电路设计相关企业今后都能申请此平台支持,重庆渝北区政府将对符合条件的项目与企业提供优惠补贴,帮助其迅速并以优惠价格获得ARM IP、设计工具以及相关培训与技术支持等。该平台的建立有利于IC设计企业降低前期研发和运营成本,并推动创建创新创业项目。 ARM架构集成电路产业支持平台的建立,标志着重庆仙桃数据谷ARM生态产业园的核心部分
[嵌入式]
ARM9微控制器LPC3180的软硬件平台设计
嵌入式应用系统设计包括硬件平台和软件平台两部分。前者是以嵌入式微控制器/微处理器为核心的硬件系统;后者则是围绕嵌入式操作系统构建的软件系统。两者在设计上是密不可分的,并且需要在设计之间进行权衡优化,根据实际应用进行外扩和裁剪。 基于ARM926EJS内核的LPC3180内部集成了丰富的外设资源,为嵌入式系统构建提供了很大的设计空间。本文结合笔者开发LPC3180嵌入式平台的实际经验,将具体介绍该系统的实现、结构组成和实验结果。 1 LPC3180芯片特性介绍 LPC3180是Philips公司新推出的一款ARM9微控制器。它采用90nm工艺技术,片内集成ARM9EJS处理器内核,具有高计算性能、低功耗的特性,这使得在很多
[应用]
ARM9微控制器LPC3180的软硬件平台设计
摘要 介绍以Philips LPC3180微控制器为核心的嵌入式软硬件平台设计;对系统设计的硬件部分和软件部分进行详细的分析,并针对LPC3180芯片特性着重讨论了其软件系统构建以及系统启动流程。实验结果表明,LPC3180嵌入式系统平台结合片内硬件浮点运算单元,具有高性能的浮点运算处理能力,可满足复杂的嵌入式应用场合的要求。 关键词 LPC3180 ARM9 软硬件平台 嵌入式应用系统设计包括硬件平台和软件平台两部分。前者是以嵌入式微控制器/微处理器为核心的硬件系统;后者则是围绕嵌入式操作系统构建的软件系统。两者在设计上是密不可分的,并且需要在设计之间进行权衡优化,根据实际应用进行外扩和裁剪。 基于ARM92
[应用]
Kinect移植到嵌入式ARM平台上面
我毕业设计做的libusb移植, 而kinect通信是基于libusb,所以,就做了一个kinect+libusb在嵌入式平台上面的移植, 经过几个月忙碌,终于将毕业设计给完成了,写下一点心得, 也算是我多年在csdn索取资源的回馈。 本系统主要由两个部件构成:嵌入式硬件平台和USB设备,通过USB总线建立起它们之间通讯,如图2.16所示,USB设备Kinect中包含一个USB集线器,在Kinect内部通过Hub将红外摄像头、彩色摄像头、电机等设备连接到Kinect内部USB总线上面,最后将Kinect设备连接到ARM9嵌入式硬件平台的Roothub上面。 图2.16 系统硬件连接图
[单片机]
Kinect移植到嵌入式<font color='red'>ARM</font><font color='red'>平台</font>上面
全面剖析arm平台安全架构psa
随着物联网(IoT)的发展,近年来所部署的连接设备也与日俱增,这促使针对物联网的攻击数量急剧上升,即便是小型的低成本设备, 也必须确保安全,因为它们很可能成为黑客攻击大型系统的入口。更强大、可扩展的物联网防御系统刻不容缓! 走进 Arm 的平台安全架构(PSA) 平台安全架构是一个由威胁模型、安全分析、以及硬件和固件架构规范组成的整体。PSA 提供了一个基于行业最佳实践的框架,通过它可以在硬件和固件层面实现一致的安全设计。它为制造更安全的设备提供了通用规则和更加经济的方法。另外,Arm 还面向基于 Armv8-M 的设备推出了 PSA 固件的开源参考实施。PSA的组件按照三个总体设计的来构建: 分析,架构和实施。 1 分析
[单片机]
全面剖析<font color='red'>arm</font><font color='red'>平台</font>安全架构psa
ARM发布互动平台 激励产业合作与创新
Connected Community社区深化用户与行业专家及ARM生态系统的互动交流 2013年11月6日——ARM今日发布互动在线平台正式上线,帮助开发者简化基于ARM架构的设计工作。这一全新的互动平台是ARM下一代Connected Community社区,预计成为开发者与设计工程师协同合作、交流想法、互相挑战以及获得ARM及其合作伙伴最新动态的信息中心。这平台包含了一个中文社区的板块,为国内用户提供全中文的互动交流环境。 ARM生态系统包括了超过1,000家合作伙伴以及无数开发基于ARM技术解决方案的开发人员与工程师。在现有的ARM全球合作伙伴网络基础上,下一代ARM Connected Community社区提供了统
[嵌入式]
arm学习笔记005之Linux平台下TFTP服务器构建
TFTP(Trivial File Transfer Protocol,简单的文件传输协议)是 TCP/IP 协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务,端口号为 69。 TFTP 这种简单的基于 UDP 的文件传输协议,通常只能用于小文件的传输,并且它不具备通常的 FTP 的许多功能,因此它只能从文件服务器上获得或写入文件,不能列出目录,也不能进行认证。在嵌入式开发中,TFTP 服务用于通过网线从 PC 服务端的 TFTP 目录下下载镜像文件到开发板中。 基于 Red Hat Enterprise Linux 5 的 TFTP 服务器构建: 1.查看 TFTP 服务是
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved