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 gdb-7.2/

4、配置

$./configure --target=arm-linux --program-prefix=arm-linux- --prefix=/usr/local/arm-gdb

:--target=arm-linux意思是说目标平台是运行于ARM体系结构的linux内核;--program-prefix=arm-linux-是指生成的可执行文件的前缀,比如arm-linux-gdb,--prefix是指生成的可执行文件安装在哪个目录,这个目录需要根据实际情况作选择。如果该目录不存在,会自动创建,当然,权限足够的话。

5、编译、安装

$  make

$ make install

幸运的话,会在--prefix指定的目录下生成三个子目录:bin、lib、share,我们需要的arm-linux-gdb就在其中的bin目录下。
如果你不小心查看它的大小的话,会发觉它有14MB那么大!天呐!怎么会占这么多空间?没关系,我们可以为它瘦身。没错!就是使用strip命令!

$ strip arm-linux-gdb -o arm-linux-gdb-stripped
$ ls -lh 
总计 33M

-rwxr-xr-x 1 latelee root 14M 12-14 16:16 arm-linux-gdb

-rwxr-xr-x 1 latelee root 3.1M 12-14 16:25 arm-linux-gdb-stripped

可以看到,strip后的文件大小只有3.1MB,瘦身效果明显!如果做广告的话,绝对有说服力。
这个文件就是我们以后远程调试时在主机上运行的交叉调试器了:在主机上执行,调试的却是另一种体系结构的代码。但是,光有主机的调试器还不够。还需要在目标板上运行一个叫gdbserver的东东。这个东东是怎么来的呢?

1、在刚才那个gdb解压后的目录:gdb-7.2,进入./gdb/gdbserver子目录

gdbserver

1、cd gdb/gdbserver/

2、配置: ./configure --target=arm-hismall-linux --host=arm-hismall-linux --prefix=/mnt/hgfs/vmshare/gdbserver7.41/

(同样,target 和 host 为你的交叉编译器, prefix为安装的目录)

  

3、编译: make CC=make CC=arm-hismall-linux-gcc

出现错误:

linux-arm-low.c: In function `arm_stopped_by_watchpoint‘:

linux-arm-low.c:642: error: `PTRACE_GETSIGINFO‘ undeclared (first use in this function)

linux-arm-low.c:642: error: (Each undeclared identifier is reported only once

linux-arm-low.c:642: error: for each function it appears in.)

 

解决方法:这里提示没有PTRACE_GETSIGINFO这个东西,这里搜索PTRACE_GETSIGINFO的路径为-I指定的头文件以及交叉 编译工

 

具链,我们不妨到交叉编译工具链里面去查找一下:

cd /usr/local/arm/3.4.5/

grep "PTRACE_GETSIGINFO" * -nR

找到如下信息:

arm-linux/sys-include/linux/ptrace.h:27:#define PTRACE_GETSIGINFO       0x4202

arm-linux/include/linux/ptrace.h:27:#define PTRACE_GETSIGINFO   0x4202

distributed/arm-linux/sys-include/linux/ptrace.h:27:#define PTRACE_GETSIGINFO  0x4202

distributed/arm-linux/include/linux/ptrace.h:27:#define PTRACE_GETSIGINFO       0x4202

说明PTRACE_GETSIGINFO是在交叉编译工具链:linux/ptrace.h文件里定义的,那么可能是头文件没有包含好吧!

我们到gdbserver下的linux-arm-low.c里面一看,可不是嘛,只有:#include <sys/ptrace.h>而没有:#include 

 

<linux/ptrace.h>,于是在linux-arm-low.c文件中加上:#include <linux/ptrace.h>,再次编译:make CC=/usr/local/arm/3.4.5/bin/arm-linux-gcc

成功!

32位,ARM平台,动态链接,未strip。
同样,我们也减小它的体积:

 

     # arm-hismall-linux-strip gdbserver

[[email protected] gdbserver]# ls gdbserver -l

-rwxrwxrwx 1 root root 498279 2012-12-30 06:21 gdbserver

[[email protected] gdbserver]# ls gdbserver -l

-rwxrwxrwx 1 root root 209048 2012-12-30 06:53 gdbserver

瘦身效果同样那么明显!
注意,这里必须使用strip的交叉版本,也就是你交叉编译器带的strip工具,我的是arm-hismall-linux-strip

[[email protected] gdbserver]# file gdbserver

gdbserver: ELF 32-bit LSB executable, ARM, version 1, dynamically linked (uses shared libs), stripped

到此,我们生成了两个重量级别的文件:arm-linux-gdbgdbserver。它们的版本是一致的,这一点非常重要。我们需要将gdbserver下载到开发板中,——可以通过各种各样的手段,包括但不限于NFS。调试时需要在开发板中运行这个程序。同时在主机中执行arm-linux-gdb调试器。

GDB+GDBServer的使用

在目标系统上启动gdbserver,其实就是在超级终端下或者minicom下启动gdbserver。这里将gdbserver放在宿主机的NFS设置的共享目录下/home/zzl,该目录挂载在目标板/work下。宿主机的ip为192.168.1.1,目标板的ip为192.168.1.33

超级终端或者minicom下

[[email protected]]cd /work

[[email protected]]./gdbserver 192.168.1.1:1234 hello

出现提示:
Process /work/hello created: pid=69
Listening on port 1234

这时切换到宿主机的控制台,运行

[[email protected]] arm-softfloat-linux-gnu-gdb hello

(gdb) target remote 192.168.2.33:1234

出现提示:
Remote debugging using 192.168.1.33:1234
[New thread 80]
[Switching to thread 80]
0x40002a90 in ??()
同时在minicom下提示:
Remote debugging from host 192.168.2.100
(gdb)
连接成功,这时候就可以输入各种gdb命令如list、continue、next、step、break等进行程序调试了。

使用GDB调试core文件

$ gdb --core=core.9128 
GNU gdb Asianux (6.0post-0.20040223.17.1AX) 
Copyright 2004 Free Software Foundation, Inc. 
GDB is free software, covered by the GNU General Public License, and you are 
welcome to change it and/or distribute copies of it under certain conditions. 
Type "show copying" to see the conditions. 
There is absolutely no warranty for GDB. Type "show warranty" for details. 
This GDB was configured as "i386-asianux-linux-gnu". 
Core was generated by `./a.out‘. 
Program terminated with signal 11, Segmentation fault. 
#0 0x08048373 in ?? () 
(gdb) bt 
#0 0x08048373 in ?? () 
#1 0xbfffd8f8 in ?? () 
#2 0x0804839e in ?? () 
#3 0xb74cc6b3 in ?? () 
#4 0x00000000 in ?? ()

此时用bt看不到backtrace,也就是调用堆栈,原来GDB还不知道符号信息在哪里。我们告诉它一下:

(gdb) file ./a.out 
Reading symbols from ./a.out...done. 
Using host libthread_db library "/lib/tls/libthread_db.so.1". 
(gdb) bt 
#0 0x08048373 in sub () at foo.c:17 
#1 0x08048359 in main () at foo.c:8

此时backtrace出来了。

(gdb) l 
8        sub(); 
9        return 0; 
10    } 
11 
12    static void sub(void) 
13    { 
14        int *p = NULL; 
15 
16         
17        printf("%d", *p); 
(gdb)

对于GDBServer出现的问题

1.  GDBServer调试时出现packet error 问题。

主要是虚拟机与目标机的网络连接要经过windows,数据包容易丢失。换到Linux系统下则恢复正常。

时间: 2024-10-06 02:52:47

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

linux下用eclipse + GDBserver + JLINK 在线调试(ARM11)

(一)环境: 目标版:TINY6410 OS:centOS6.5 IDE:eclipse luna CDT:v8.3 GDB:V7.5 (二)环境监理 1.安装cenntos:参考其他相关文章,这里重点是JLINK操作. 2.安装eclipse:下载 http://www.eclipse.org/downloads/ 3.安装CDT:下载 http://www.eclipse.org/cdt/downloads.php 安装(参考官方的手册:http://help.eclipse.org/lun

linux下交叉编译libcurl

linux下交叉编译libcurl: ./configure --prefix=/usr/local/arm-2014.05/lib/ CC=/usr/local/arm-2014.05/bin/arm-none-linux-gnueabi-gcc --host=arm-linux --disable-shared --enable-static --without-libidn --enable-ssl --without-librtmp --without-gnutls --without-

解决gdb 调试 core 文件函数名显示为问号的问题

关于gdb调试core文件总是一堆问号的问题 问题描述:已经在编译选项中加入了-g,但是查看core文件时,还是一堆问号,使用的命令为:gdb -c core 解决方案:由于gdb -c core这样的使用在有些系统下支持不是很好,所以推荐用如下两种方法: 1) gdb exe (gdb) core-file core 2) gdb -c core (gdb) file exe

gd调试命令,gdb调试core文件

使用 gcc -g test.c -o test.out 编译程序,只有加-g参数才支持gdb调试: 然后 gdb ./test.out 运行可执行文件,进入gdb调试模式(gdb),在括号后面的输入命令: (gdb)help:查看命令帮助 (gdb)start:单行执行 (gdb)l:查看源程序 (gdb)n:执行下一行 (gdb)s:进入被调函数里面 (gdb)bt:查看函数调用栈 (gdb)p 变量:打印变量值 (gdb)f:切换函数栈帧 (gdb)run:重新开始运行文件 (gdb)fi

gdb调试core文件

什么是Core Dump?Core的意思是内存, Dump的意思是扔出来, 堆出来.开发和使用Unix程序时, 有时程序莫名其妙的down了, 却没有任何的提示(有时候会提示core dumped). 这时候可以查看一下有没有形如core.进程号的文件生成, 这个文件便是操作系统把程序down掉时的内存内容扔出来生成的, 它可以做为调试程序的参考.core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core

在linux下的使用复制命令cp,不让出现“overwrite”(文件覆盖)提示的方法。(转)

在linux下的使用复制命令cp,不让出现"overwrite"(文件覆盖)提示的方法. 一般我们在使用cp命令时加上-f选项,希望不让出现"overwrite"的提示(文件覆盖的提示).如:# cp -rf sourcefile targetdir 或#cp -r -f sourcefile targetdir-r的意思是递归复制,也就是复制文件夹及其下所有文件.-f的意思是遇到同名的文件时不提示,直接覆盖. 但是为什么加上-f了,还出现"overwri

Linux下的两个辅助编程工具 perf 和 GDB

前几天在实验室做了几个小实验,受益匪浅,写代码倒是其次,最重要的是渐渐了解了真实的 计算机科学 工作方式. 很多工作都可以用 linux 下的工具高效完成,例如 要跑一组实验,其中有两个参数变动,那么就不需要手动运行多次,只用一个 Shell Script 就能完成.配合 awk 效率更高. 其中两个工具真得很受用,一个是 GDB, 一个是 perf.前者用于程序调试,后者用于程序性能侦测. GDB 是linux下很出色的调试器, 很多常用的调试工具,例如 breakpoint, call st

Linux下oracle系统安装到数据库建立配置及最后oracle的dmp文件导入一站式操作记录

简介 之前也在linux下安装过oralce,可每次都是迷迷糊糊的,因为大脑一片空白,网上随便看见一个文档就直接复制,最后搞了乱七八糟,虽然装上了,却乱得很,最近几天因为离职,交接的时候又要安装oracle,发现老遇到错误,导致装不上了,通过这次我好好的研究了下oracle,非要搞清楚它,现在记录下来,希望能给其他网上朋友遇到问题时提供点帮助,该篇文件借鉴大量网友的总结,首先谢谢他们! 安装环境 Linux 服务器: SuSe11-linux      64/32位 Oracle服务器: Ora

Linux下oracle11gR2系统安装到数据库建立配置及最后oracle的dmp文件导入一站式操作记录(转)

简介 之前也在linux下安装过oralce,可每次都是迷迷糊糊的,因为大脑一片空白,网上随便看见一个文档就直接复制,最后搞了乱七八糟,虽然装上了,却乱得很,最近几天因为离职,交接的时候又要安装oracle,发现老遇到错误,导致装不上了,通过这次我好好的研究了下oracle,非要搞清楚它,现在记录下来,希望能给其他网上朋友遇到问题时提供点帮助,该篇文件借鉴大量网友的总结,首先谢谢他们! 安装环境 Linux 服务器: SuSe11-linux      64/32位 Oracle服务器: Ora