gdb+gdbserver交叉编译

转载请注明原文出处,http://www.cnblogs.com/flyingcloude/p/6992405.html

一、gdb、gdbserver总体介绍

远程调试环境由宿主机GDB和目标机调试stub共同构成,两者通过串口或TCP连接。使用 GDB标准程串行协议协同工作,实现对目标机上的系统内核和上层应用的监控和调试功能。调试stub是嵌入式系统中的一段代码,作为宿主机GDB和目标机 调试程序间的一个媒介而存在。

就目前而言,嵌入式Linux系统中,主要有三种远程调试方法,分别适用于不同场合的调试工作:用ROM Monitor调试目标机程序、用KGDB调试系统内核和用gdbserver调试用户空间程序。这三种调试方法的区别主要在于,目标机远程调试stub 的存在形式的不同,而其设计思路和实现方法则是大致相同的。

而我们最常用的是调试应用程序。就是采用gdb+gdbserver的方式进行调试。在很多情况下,用户需要对一个应用程序进行反复调试,特别是复 杂的程序。采用GDB方法调试,由于嵌入式系统资源有限性,一般不能直接在目标系统上进行调试,通常采用gdb+gdbserver的方式进行调试。

二、配置编译及安装下载

嵌入式linux的GDB调试环境由Host和Target两部分组成,Host端使用arm-linux-gdb,Target端使用gdbserver。这样,应用程序在嵌入式目标系统上运行,而gdb调试在Host端。一般linux都有一个自带的GDB,但是不能直接使用,而要获取GDB源代码包,针对ARM平台作一个简单配置,重新编译得到相应的GDB。

GDB的源代码包可以从 http://www.gnu.org/software/gdb/download/ 下载

我下载的是gdb-7.3版,放在~/Downloads目录下

以下是配置编译步骤:

cd gdb-7.3
./configure --target=arm-linux --prefix=/usr/local/arm-gdb -v

--target配置gdb的目标平台,--prefix配置安装路径

编译    make

安装    make install

至此,gdb安装完成。

接下来为linux-arm安装gdbserver

进入~/Downloads/gdb-7.3/gdb/gdbserver

配置

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

编译

make CC=arm-linux-gcc

没有错误的话,就在gdbserver目录下生成gdbserver可执行文件,更改其属性,使用任何人都可以读写执行。

chmod 777 gdbserver
arm-linux-strip gdbserver

将多余的符号信息删除,可让elf文件更精简。

然后通过NFS传给linux-arm,并将gdbserver放入根文件系统分区的/usr/bin

具体NFS的操作方法:http://www.cnblogs.com/flyingcloude/archive/2012/10/23/2735495.html

三、调试

下载GNU Hello

这个软件包需要配置成使用交叉编译;不过这其实很容易做;它只需要一个交叉编译器的前缀。

wget http://ftp.gnu.org/gnu/hello/hello-2.6.tar.gz

tar xzf hello-2.6.tar.gz

cd hello-2.6

./configure --host=arm-none-linux-gnueabi

make

cd ..

结果就是一个ARM架构的可执行文件“hello-2.6/src/hello”。

开始调试

在linux-arm中运行 gdbserver --multi 192.168.1.123:1234

在host中,运行

arm-linux-gdb

要调试远端的程序,我需要告诉GDB使用ARM的共享库而不是本地库(那些用于32位x86的);否则执行的时候调试器会抱怨说库不匹配。

1     set solib-absolute-prefix nonexistantpath
2     set solib-search-path /opt/FriendlyARM/toolschain/4.4.3/arm/arm-none-linux-gnueabi/lib/
3     file ./hello-2.6/src/hello
4     target extended-remote 192.168.1.123:1234
5     set remote exec-file /nfs/hello
6     break main
7     run
(gdb) target extended-remote 192.168.1.123:1234
Remote debugging using 192.168.1.123:1234
(gdb) set remote exec-file /nfs/hello
(gdb) break main
Breakpoint 1 at 0x8c24: file hello.c, line 46.
(gdb) run
Starting program: /home/ubuntu/nfs/hello
warning: Can not parse XML target description; XML support was disabled at compile time
warning: Unable to find dynamic linker breakpoint function.
GDB will be unable to debug shared library initializers
and track explicitly loaded dynamic code.
Cannot access memory at address 0x0
warning: Could not load shared library symbols for 2 libraries, e.g. /lib/arm-linux-gnueabi/libc.so.6.
Use the "info sharedlibrary" command to see the complete listing.
Do you need "set solib-search-path" or "set sysroot"?

Breakpoint 1, main (argc=1, argv=0xbe85ce34) at hello.c:46
46    {
(gdb) 

转载请注明原文出处,http://www.cnblogs.com/flyingcloude/p/6992405.html

时间: 2024-08-30 09:40:41

gdb+gdbserver交叉编译的相关文章

嵌入式arm linux环境中gdb+gdbserver调试

一.前言嵌入式Linux系统中,应用开发过程中,很多情况下,用户需要对一个应用程序进行反复调试,特别是复杂的程序.采用GDB方法调试,由于嵌入式系统资源有限性,一般不能直接在目标系统上进行调试,通常采用gdb+gdbserver的方式进行调试. Gdbserver在目标系统中运行,gdb则在宿主机上运行.目标系统必须包括gdbserver程序,宿主机也必须安装gdb程序.在此我们还不能直接采用linux发行版自带的gdb,需要交叉编译gdb和gdbserver. 二.编译gdb和gdbserve

GDB + gdbserver 远程调试android native code

原文地址:GDB + gdbserver 远程调试android native code 作者:tq08g2z 以调试模拟器中的native library code为例. Host: ubuntuTarget: Android ICS 1.将gdbserver放入设备. 确保系统有arm-*-gdb,及存在设备端将要运行的gdbserver,gdbserver可以由google ndk中获取,在ndk的如下目录可以找到这个文件: 点击(此处)折叠或打开 android-ndk-r8/toolc

使用gdb+gdbserver调试应用程序

目录 一.gdb基本使用 1. 启动gdb 2. gdb交互式命令 二.gdb + gdbserver 实现远程调试 一.gdb基本使用 ? GDB是一个由GNU开源组织发布的.UNIX/LINUX操作系统下的.基于命令行的.功能强大的程序调试工具. 对于一名Linux下工作的c++程序员,gdb是必不可少的工具: 1. 启动gdb ? 对于C/C++程序,编译的时候需要加上 -g 参数生成调试信息.如:gcc -g hello.c -o hello 调试可执行程序 $gdb 程序名称 $gdb

搭建交叉调试环境 arm-linux-gdb配合gdbserver

    在嵌入式开发中,有时候需要进行源码级别的调试,可以设置断点,单步执行,相比于每步打印printf或者printk来说,更加友好.下面就来介绍这种调试方法.     gdb交叉调试类似于网络浏览器,本地PC为客户端,远程开发板为服务器端,双方都要统一编译工具链,版本最好保持一致.     --target 指定了目标机交叉编译器前缀,比如--target=arm-linux ,缺省值为i386-linux    --host   指定了编译后的程序需要在哪里运行, 比如,--host=ar

Linux下交叉编译gdb,gdbserver+gdb的使用以及通过gdb调试core文件

交叉编译gdb和gdbserver 1.下载gdb:下载地址为:http://ftp.gnu.org/gnu/gdb/按照一般的想法,最新版本越好,因此下载7.2这个版本.当然,凡事无绝对.我们以gdb-7.2.tar.bz2 这个文件为例.2.解压缩: $ tar jxvf gdb-7.2.tar.bz2 注:小技巧:Linux下一般压缩文件后缀为.tar.bz2和.tar.gz,它们解压命令有两三个选项是一致的: xf(v),前者再加上j选项,后者再加上z选项. 3.进入该目录 $ cd g

用Eclipse和GDB构建ARM交叉编译和在线调试环境

我们在 Linux 主机中搭建我们的开发环境,使用 Ubuntu 10.04 LTS 为例. 搭建应用开发环境 安装 JRE Eclipse 依赖于Java 环境,所以必须先安装 JRE 或 JDK. 安装 Eclipse 和 CDT 去Eclipse官网下载最新的Eclipse IDE. 我们一般选择 C/C++ 版本(Eclipse IDE for C/C++ Developers),这个版本自带了CDT,不用另行安装CDT插件.下载时选择 Linux 的版本,如:eclipse-cpp-j

linux内核调试技术之GDB和GDBServer

1.调试原理 GDB调试是应用程序在开发板上运行,然后在PC机上对开发板上得应用程序进行调试,PC机运行GDB,开发板上运行GDBServer.在应用程序调试的时候,pc机上的gdb向开发板上的GDBServer发出命令,而开发板上的gdbserver就会向应用程序发出信号,使应用程序停下来或者完成其他一些工作. 2.安装GDB和GDBServer(gdb-7.4.tar.bz2 ) 2.1.GDB 1.下载: http://ftp.gnu.org/gnu/gdb/ 2.解压:tar xvf g

Linux学习: 使用gdb和gdbserver进行远程调试

1.引言 在日常程序开发中不免遇到类似空指针操作导致程序崩溃的问题,所以需要一定的手段去定位bug,而断点调试是普遍使用的技巧,比如Windows中用VC++的debug模式进单步运行.断点调试等,有很友好的图形化操作界面,而在Linux中使用的是没有图形界面的调试工具-GDB(听说eclipse支持GUI调试,暂未尝试),所以需要通过指令进行操作,下面逐步介绍gdb调试环境的搭建和使用方法. 2.gdb调试环境搭建 (1)下载gdb工具源码:http://www.gnu.org/softwar

Linux学习: 使用gdb和gdbserver进行调试

1.引言 在日常程序开发中不免遇到类似空指针操作导致程序崩溃的问题,所以需要一定的手段去定位bug,而断点调试是普遍使用的技巧,比如Windows中用VC++的debug模式进单步运行.断点调试等,有很友好的图形化操作界面,而在Linux中使用的是没有图形界面的调试工具-GDB(听说eclipse支持GUI调试,暂未尝试),所以需要通过指令进行操作,下面逐步介绍gdb调试环境的搭建和使用方法. 2.gdb调试环境搭建 (1)下载gdb工具源码:http://www.gnu.org/softwar