在嵌入式开发中,有时候需要进行源码级别的调试,可以设置断点,单步执行,相比于每步打印printf或者printk来说,更加友好。下面就来介绍这种调试方法。

    gdb交叉调试类似于网络浏览器,本地PC为客户端,远程开发板为服务器端,双方都要统一编译工具链,版本最好保持一致。 

   --target 指定了目标机交叉编译器前缀,比如--target=arm-linux ,缺省值为i386-linux

   --host   指定了编译后的程序需要在哪里运行, 比如,--host=arm-linux

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

    因此,在编译arm-linux-gdb的时候,不需要指定host,因为它是在本地PC上跑的,在编译gdbserver时,需要指定host为arm-linux,因为,gdbserver是在arm平台上跑的。两者都需要指定相同的target。

    编译arm-linux-gdb

    在gdb-7.8的解压目录下新建 arm-gdb,用于存放编译生成文件。

    ./configure --target=arm-linux --prefix=/ -gdb/

     然后make && make install ,就可以在arn-gdb/bin/目录下面找到arm-linux-gdb,

     如果有需要,可以将此执行路径加入到系统环境变量中去。

    编译gdbserver

    在gdb-7.8目录中,切换到gdb/gdbserver目录中,

    ./configure  --target=arm-linux  --host=arm-linux

    然后 make CC=/opt/gcc-3.4.5-glibc-2.3.6/bin/arm-linux-gcc ,就可以再当前目录下生成gdbserver。

    这里需要注意的是运行gdbserver还需要libthread_db库,若你自己做的文件系统内没有这个库的话需要将本地交叉编译工具中的libthread_db*拷贝到开发板中去。

    sudo cp /opt/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/libthread_db* /home/hao/nfs/lib/ –d

    使用-d选项,复制时,连同链接关系一起复制过去。

    使用方法

    将生成的gdbserver拷贝到开发板上去,PC机和开发板之间通过nfs文件系统沟通,开发板IP:192.168.0.200,本地主机IP:192.168.0.104

    在本地机器上面,用arm-linux-gcc –g 编译一个应用程序,在开发板上,执行

   

    gpbserver使用方法: gpbserver 开发板ip地址:通信端口(随意取) 要调试的程序 【程序的命令行参数】

    然后在本地机器上面,启动arm-linux-gdb,操作如下:

  

    连接成功后,开发板上会显示:

   

    然后就可以在本地PC上面执行gdb命令,调试输出在

    注意:执行target remote 后,开发板上面的程序已经在运行,本地不能使用run命令,而能用continue命令。

    调试命令在本地输入,调试输出结果在开发板上面输出。

    原理介绍,在开发板上面的gdbserver会启动一个子进程,然后用测试程序替换子进程,自身作为父进程,接收来自PC机上面arm-ling-gdb的调试命令输入,

   

    让程序在奔溃时产生core dump文件,用PC机上面的arm-linux-gdb来分析此文件,确定崩溃位置。  

    1. 产生core dump文件

       linux系统默认是不产生core dump文件(ulimit –c 得出结果为0,程序不产生),设置ulimit –c unlimited,不限制core dump输出大小。

    2. 执行待测试程序,产生core dump文件,默认名为core

    3. 使用arm-linux-gdb调试core文件

        在本地PC机器上面,执行 arm-linux-gdb ./test_debug ./core 文件,就可以发现产生段错误的地址。

   

      这样的调试,看起来很复杂,如果实在想调试,而且CPU处理速度够快的话,直接移植低版本的gdb到板子上就行。

 

  gdb交叉调试相关链接:

  tiny4412 android gdb调试问题,不能打断点(已解决)

  使用gdbserver远程调试 遇到问题

  gdb+gdbserver交叉编译

Technorati 标签: gdbserver,linux

搭建交叉调试环境 arm-linux-gdb配合gdbserver的更多相关文章

  1. Redis源码漂流记(二)-搭建Redis调试环境

    Redis源码漂流记(二)-搭建Redis调试环境 一.目标 搭建Redis调试环境 简要理解Redis命令运转流程 二.前提 1.有一些c知识简单基础(变量命名.常用数据类型.指针等) 可以参考这篇 ...

  2. 用Intellij idea搭建solr调试环境

    最近在使用solr时,配置会有一些问题,log里面打印出日志了,但是还是不知道发生这样错误的原因.于是想学习一下相关的solr源码,以下是如何搭建solr调试环境步骤. solr调试环境搭建,首先下载 ...

  3. 使用Sublime Text搭建python调试环境

    原文地址:http://blog.csdn.net/wenxuansoft/article/details/38559731 pycharmt等IDE虽然用着爽,但毕竟在速度.资源上还是比较让人不爽的 ...

  4. win10下正确使用Sublime Text搭建python调试环境

      pycharmt等IDE虽然用着爽,但毕竟在速度.资源上还是比较让人不爽的. 使用IDE无非是图个方便省事,特别是像我这种有些记性差的来说. IDE说起来方便于的几个地方就是: 1.语法颜色高亮 ...

  5. 使用Sublime Text搭建python调试环境[转]

    pycharmt等IDE虽然用着爽,但毕竟在速度.资源上还是比较让人不爽的. 使用IDE无非是图个方便省事,特别是像我这种有些记性差的来说. IDE说起来方便于的几个地方就是: 1.语法颜色高亮 2. ...

  6. HBase二次开发之搭建HBase调试环境,如何远程debug HBase源代码

    版本 HDP:3.0.1.0 HBase:2.0.0 一.前言 之前的文章也提到过,最近工作中需要对HBase进行二次开发(参照HBase的AES加密方法,为HBase增加SMS4数据加密类型).研究 ...

  7. 使用Visual Studio Code搭建PHP调试环境

    1.需要安装的软件 Visual Studio Code. WAMP(包括Apache.MySQL.PHP.以及最关键的XDebug) 2.下载软件 Visual Studio Code,光看名字就知 ...

  8. 用Qemu模拟vexpress-a9 (二) --- 搭建u-boot调试环境

    参考: http://blog.csdn.net/caspiansea/article/details/12986565 环境介绍 Win7 64 + Vmware 11 + ubuntu14.04 ...

  9. 阿里云服务器连接以及centos 搭建 web java环境(linux java部署 tomcat部署)

    版权声明:本文为博主原创文章,未经博主允许不得转载. 最近弄了个试用阿里云服务器倒腾了半天终于部署好,分享一下. 1.登入阿里云打开你申请的是云服务器的实例: 点击重置密码---重置密码后重启服务器才 ...

随机推荐

  1. html页面去掉滚动条

    有时候特别需要,个别网页要去掉横向滚动条和竖向滚动条,那该怎么去掉呢,很简单,看代码: 让竖条没有: <body style=`overflow:-Scroll;overflow-y:hidde ...

  2. Android开发(九)——ViewFlipper实现图片轮播

    图片轮播的实现方法有很多,主要有View.ViewFilpper.ViewFilpper系统自带的一个多页面管理控件,它可以实现子界面的自动切换. 首先 需要为ViewFlipper加入View (1 ...

  3. 6. EM算法-高斯混合模型GMM+Lasso详细代码实现

    1. 前言 我们之前有介绍过4. EM算法-高斯混合模型GMM详细代码实现,在那片博文里面把GMM说涉及到的过程,可能会遇到的问题,基本讲了.今天我们升级下,主要一起解析下EM算法中GMM(搞事混合模 ...

  4. js 删除数组几种方法

    var arr=['a','b','c']; 若要删除其中的'b',有两种方法: 1.delete方法:delete arr[1] 这种方式数组长度不变,此时arr[1]变为undefined了,但是 ...

  5. Jquery的回调函数的使用

    用$.Callbacks实现观察者模式 // 观察者模式 var observer = { hash: {}, subscribe: function(id, callback) { if (type ...

  6. Base64与MD5的区别

    Base64和MD5都可用于做信息的简单加密,两者的简单差别如下: Base64 可逆性. 可以将图片等二进制文件转换为文本文件. 可以把非ASCII字符的数据转换成ASCII字符,避免不可见字符. ...

  7. Instant Django 1.5 Application Development Starter

    Django is a high-level Python Web framework that encourages rapid development and clean, pragmatic d ...

  8. 【html】param 以及 embed 的有关 flash 属性详解

    本文主要介绍 param 和 embed 标签中有关 flash 的一些属性及其属性值. 首先我们需要知道 param 和 embed 标签是单独出现的,而不是成对出现的,下面的代码是一般 flash ...

  9. 解决springmvc使用ResponseBody注解返回json中文乱码问题

    spring版本:4.2.5.RELEASE 查看“org.springframework.http.converter.StringHttpMessageConverter”源码,中有一段说明: B ...

  10. JQ 点击指定文本框显示div。点击其他区域隐藏DIV

    <input id="username" type="text" style="width:90%;margin-top: 40px;" ...