转载于:http://blog.chinaunix.net/uid-23381466-id-309369.html

arm-linux的gdb移植分为两种情况.一种是交叉调试版。这一种模式是需要编译一个arm-linux版本gdbserver (GDB的stub模块).然后再编译一个X86版本交叉调试的gdb.为了与桌面版本身的gdb 区别开来,一般改名为 arm-linux-gdb。两者通过串口或者网络进行互联。
还有一种是干脆把整个gdb移植成一个ARM的本地版。在开发板上直接用gdb来调试。
前一种方法是比较正统的方法。它gdbserver可以通过arm-linux-gdb直接在host上单步调试target的应用程序。.并且可以与图形界面调试器配合进行图形界面调试。缺点就是target资源较少。因此单步调试的速度并不是太快。因此实用性不算太强。
如何交叉调试
arm-linux的本地版一般只能做字符界面的。界面没有支持GUI的交叉调试版友好。而且单步调试速度也不算快。但是有几大大优点:
1.定位程序退出所在函数.
2.判断程序退出的原因
3.通过条件断点分析异常情况时运行环境.

用本地版gdb运行程序时,当程序因段错误或其它原因退出程序时。可以通过gdb bt(即backtrace)来查看最后运行的堆栈。来判断出错时是在哪一个函数里退出。这样会大大加快定位错误的速度,这样有时需要几天的定位的错误,可能只需要几分钟即可定位,这在嵌入式开发里有很强实际效用。

因此在这里我们把两种版本的gdb都移植一下。

---------------------------------------------------------------------------------------------
1. 本地版本的gdb的移植

ARM本地版需要ncurse的支持。这里移植是gdb 6.8.
编译器是 arm-linux-gcc 4.3.3 .
操作系统是 arm-linux 2.30.4
ncurse 5.6 。

按照移植规范,ncurse放入libs目录,gdb 解压在项目目录下

/home/hxy/gdb (项目目录)
|
+--output
|      |_arm-linux
|-- gdb 6.8|
|--
|--libs
   |-- ncurse

1.1 ncurse库的移植
解压 tar xvzf ncurses-5.6.tar.gz
         cd ncurses-5.6
生成makefile
./configure --host=arm-linux  --prefix=$PWD/output/arm --without-ada --enable-termcap --with-shared

其中--enable-termcap比较关键gdb需要这个库
编译 make
安装 make install
libncurses.so 库应该在/home/hxy/gdb/output/arm-linux/lib
1.2 gdb本身的移植。
解压 tar xvjf gdb-6.8.tar.bz2
cd gdb-6.8
生成Makefile
./configure --host=arm-linux --enable-shared --prefix=$PWD/output/arm --without-x --disable-gdbtk --disable-tui --without-included-regex --without-included-gettext LDFLAGS="-L$PWD/../output/arm-linux/lib" CPPFLAGS="-I$PWD/../output/arm-linux/include"

脚本含义下:
--enable-shared    动态编译
--host=arm-linux  用arm-linux-gcc编译
--prefix="$PWD/../output/arm-linux" 安装目录
--without-x     取消x windows 支持
--disable-gdbtk  取消gdbtk,应该也是图形界面相关的
--disable-tui   取消tui 界面
--without-included-regex 关闭正则表达式库
--without-included-gettext  去掉用于多语言处理的 gettext库
   正则表达式/gettext,暂时不需要,先去掉
CPPFLAGS/LDFLAGS是确保能找到ARM版的ncurses库
   编译 make
如果gdb 6.7有一个警告会当成bug处理symtab.c: In function 'find_line_symtab':
symtab.c:2252: error: 'exact' may be used uninitialized in this function
只要简单把int exact;变成int exact =0 ; 即可编译通过

补充:在arm-linux-gcc 4.4.1 (s3c6410)下有如下编译错误   eval.c: In function 'evaluate_subexp_standard':
eval.c:1705: error: 'subscript_array' may be used uninitialized in this function

分析源码发现,是编译器认为这个数组定义后未初始化造成的(可能是bug).因此在在eval.c::1650 行加入进入初始操作.如此编译通过
            memset(subscript_array,0,sizeof(int)*MAX_FORTRAN_DIMS);

安装 make install
最终的arm的程序gdb应该在home/hxy/gdb/output/arm-linux/bin下面,将其拷贝和libncurses.so拷贝到开发板上即可运行,象x86的GDB一样运行即可

注意这个样编译能同时把ARM版gdbserver 也同时编译出来并在安装目录看到.而且一般eabi的gcc编译器都自带了arm-linux-gdb.所以交叉版本的gdb移植很多时候可以省略.
刚刚编译出来的gdb尺寸相当大,10M多,因此必须要用arm-linux-strip gdb 来把尺寸减少.strip后大约2M多.

---------------------------------------------------------------------------------------------
2.交叉版本的gdb移植
交叉版本中,arm-linux-gcc 3.3.2 只能成功编译gdb 5.2.1.gdb 6.x 需要更gcc 3.4.4以上版本。
eabi arm-linux-gcc 4.3.3 编译可以成功编译gdb 6.8.

因为交叉版等于要移植两个平台程序.(x86的arm-linux-gdb和arm 版的gdb server)
这里目录结构调整如下

/home/hxy/gdb
|
+--output
|      |_arm-linux
|      |_x86-linux
|-- gdb 6.8
|   |-- cross-gdb #保存x86 gdb
|    |- -gdb/gdbserver #原有目录,在此编译arm gdbserver,
|
|--libs
   |-- ncurse

因其中cross-gdb是手工创建为了存放x86的目标代码

2.1编译 cross 调试的gdb 6.8
在/home/hxy/gdb/gdb-6.8 清除上一次结果 make distclean
创建/home/hxy/gdb/gdb-6.8/cross-gdb
在上述目录生成Makefile
 
  ../configure --target=arm-linux --enable-shared --prefix=$PWD/../../output/x86-linux --without-x --disable-gdbtk --without-included-regex --without-include-gettext
其中大部分参数跟本地版gdb含意类似。但是--target=arm-linux 表示target是arm-linux版的。而且是安装在X86-linux下

编译 make
安装 make install
 应该是安装在/home/hxy/gdb/output/x86-linux/bin/,名字是arm-linux-gdb
2.2生成arm版gdbserver
  生成Makefile 在/home/hxy/gdb/gdb-6.8/gdb/gdbserver执行如下脚本
./configure --host=arm-linux --prefix=$PWD/../../../output/arm-linux --without-include-regex --without-included-gettext
编译make
安装 make install
这里应该在/home/hxy/gdb/output/arm-linux/bin有gdbserver

至于如何使用交叉调试参见相关博文,附件是已经编译好直接在eabi库环境下使用的版本 文件:arm-gdb-6.x.zip

---------------------------------------------------------------------------------------------
3.测试ARM本机调试

我们用一个有段错误的源码来测试本地调试的性能,参见如下代码,这里在f2()产生段错误

/*
 * Andrew Huang <bluedrum@163.com>
*/
#include <stdio.h>
#include <string.h>

void f2(char * str)
{
   char buf[1024];
   strcpy(buf,(const char *)str);
}
void f1()
{
  int x = 0;
  f2((char *)x);
}

void test1()
{
   f1();
}

int main()
{
  test1();
}

编译 arm-linux-gcc test.c -o test -g
在NFS路径上测试它的调用gdb和test.速度相当快。以下是它的测试结果
[root@EmbedSky bin]# ./run.sh                                                  
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 "arm-linux"...                                      
(gdb) r                                                                        
Starting program: /mnt/nfs/gdb/output/arm-linux/bin/test                       
                                                                               
Program received signal SIGSEGV, Segmentation fault.                           
0x4009852c in strcpy () from /lib/libc.so.6                                    
(gdb) bt                                                                       
#0  0x4009852c in strcpy () from /lib/libc.so.6                                
#1  0x000083a8 in f2 (str=0x0) at test.c:8                                     
#2  0x000083d4 in f1 () at test.c:14                                           
#3  0x000083ec in test1 () at test.c:19                                        
#4  0x00008408 in main () at test.c:24                                         
(gdb)

可以看到很快能测试出段错语的位置。我也试了一下单步调试程序,发现居然比交叉调试速度还快。这个倒出乎我的意料之外

arm-linux的gdb移植的更多相关文章

  1. Boa服务器在ARM+Linux上的移植

    下面给大家介绍一下Boa服务器移植的具体操作步骤,希望能够有帮助. 环境        主机:ubuntu8.10        交叉工具链:gcc-3.4.5-glibc-2.3.6         ...

  2. 移植ARM linux下远程连接工具dropbear

    移植ARM linux下远程连接工具dropbear 原文地址:http://www.cnblogs.com/NickQ/p/9010529.html 移植zlib 下载地址:https://gith ...

  3. arm linux 移植 x265

    背景 本来想着把 x265编译到ffmpeg里面,搞定了x265的编译:但是一直报ERROR: x265 not found using pkg-config这个错误,我按照网上的资料,查看了ffbu ...

  4. Linux 安装 go 以及 arm linux 移植 go

    背景 Go是一门全新的静态类型开发语言,具有自动垃圾回收,丰富的内置类型,函数多返回值,错误处理,匿名函数,并发编程,反射等特性. 从Go1.4之后Go语言的编译器完全由Go语言编写,所以为了从源代码 ...

  5. arm linux串口蓝牙工具移植及使用【转】

    本文转载自:http://blog.csdn.net/hclydao/article/details/51451725 p6212中串口蓝牙在linux下的使用记录 一.linux蓝牙工具移植 主要使 ...

  6. ARM Linux Qt 5.x.x 无标题栏

    /********************************************************************************* * ARM Linux Qt 5. ...

  7. ARM Linux从Bootloader、kernel到filesystem启动流程

    转自:http://www.veryarm.com/1491.html ARM Linux启动流程大致为:bootloader ---->kernel---->root filesyste ...

  8. 用Qemu运行/调试arm linux【转】

    转自:https://blog.csdn.net/absurd/article/details/78984244 用Qemu运行/调试arm linux,这事情干过好几次了,久了就忘记了,每次都要重新 ...

  9. Linux最小系统移植之早期打印CONFIG_EARLY_PRINTK

    请先参考先前博文:  Linux最小系统移植之早期打印CONFIG_DEBUG_LL  , 因为eraly_printk其实就是对printch()封装的 一. 必要选项(在上面链接选中的前提下再新增 ...

  10. Linux最小系统移植之早期打印CONFIG_DEBUG_LL

    一.几个关键宏定义 CONFIG_DEBUG_LL. CONFIG_DEBUG_LL_INCLUDE 容我慢慢道来, 首先要使能早期打印, menuconfig必须选中CONFIG_DEBUG_LL, ...

随机推荐

  1. locate/find

    locate 从数据库 (/var/lib/mlocate/mlocate.db) 查找命令,使用updatedb更新库. 类似于数据库的索引建立,在首次简历索引的时候,很耗费资源,在建立完成后,查询 ...

  2. luogu P2585 [ZJOI2006]三色二叉树

    P2585 [ZJOI2006]三色二叉树 题目描述 输入输出格式 输入格式: 输入文件名:TRO.IN 输入文件仅有一行,不超过10000个字符,表示一个二叉树序列. 输出格式: 输出文件名:TRO ...

  3. [Vue] : 键盘修饰符

    键盘修饰符以及自定义键盘修饰符 为文本框回车键绑定事件 <input type="text" class="form-control" v-model=& ...

  4. SpringMVC——文件上传下载

    一.单文件上传 1.导入依赖 <dependency> <groupId>commons-io</groupId> <artifactId>common ...

  5. mysql的count和sum使用条件表达式

    count函数条件不为null的时候显示结果.即使为false也也会显示结果. 可以是使用if条件或者case when语句.如果条件不为null即需要的结果. 使用count()函数实现条件统计的基 ...

  6. 【零基础】简单说说一键果体APP的AI

    参考: https://www.jianshu.com/p/8c7a7cb7198c https://blog.csdn.net/gdymind/article/details/82696481 零. ...

  7. 第二届强网杯部分题writeup

    0x00 题目名称 签到 操作内容:   FLAG值: flag{welcome_to_qwb} 0x01 题目名称 Weclome 操作内容: 通过查看文件发现是一个bmp格式的图片文件,然后加上后 ...

  8. MySQL所谓的脏页和“抖”一下是什么联系?

    在我们平时经常用到的sql更新语句,之前是认为只要sql执行,当前sql的操作会立马执行到服务器磁盘上并返回,但是后来我才知道,事实并非如此,在了解事实之前,首先可能需要先了解什么是redo log, ...

  9. 8 HashMap

    1.Map接口 public interface Map<K, V> 将键映射到值的对象,一个映射不能包含重复的键,每个键只能映射到一个值. 具体的实现:HashMap,TreeMap, ...

  10. Elasticsearch6.5.1破解x-pack,设置密码并使用head插件登陆。

    #没有许可证的es无法持久的设置密码,而且使用一段时间后会过期,过期后,一些功能无法被使用,例如head插件无法看到es状态. 下图是过期的es的状态,可通过此url查看:http://ip:port ...