gdb linux arm low.c,gdb在arm-linux上的移植

以前一直用打桩法来调试arm-linux程序,即通过添加printf()来调试。

这一方法在通常情况下是很有用,而且也是很简单实用的。但是对于一些

很特殊很隐蔽的错误,在这时这个方法可能就不太管用了,因为你总不能

在每条语句之后都加上printf()吧。而且对于多线程的大中型应用程序,

如果你不熟悉编译器,又或者你本身就是新手的话,程序的一个小bug就有

可能让你几天睡不好觉。就像今天我遇到的一个错误,同样的程序在两块

正常的板子上跑,其中有一块板子的程序中途出现错误

*** glibc detected *** : double free or corruption (!prev):

0x001fc688 ***

导致程序崩溃,系统只能重启。这种错误根本没办法用printf()来定位。

于是我想到了使用gdb来跟踪程序,这样才能快速定位。所以赶紧将gdb5.2.1

搬出来,移植到了开发板上。

下面简单介绍下我的移植过程及遇到的问题

-----------------------------------------------------------------

编译环境

编译器:arm-linux-gcc3.4.1

源码:gdb-5.2.1

-----------------------------------------------------------------

1.编译gdb过程(x86上客户端):

#cd /home/arm/gdb

#mkdir output

#mkdir libs

#tar zxvf gdb-5.2.1.tgz

#cd ./gdb

#./configure --host=i686-pc-linux-gnu --target=arm-linux --prefix=

/home/arm/gdb/output/ --nfp -v --norecursion

(--host也可以不写)

#./configure --target=arm-linux --prefix=/home/arm/gdb/output/ --nfp

-v --norecursion

#make

#make install

编译出现问题:

错误1:

gdbtypes.c: In function ‘recursive_dump_type’:

gdbtypes.c:3059: error: invalid lvalue in increment

解决方法:替换下面几个宏,打上补丁(参照下面资料)

gcc 3.4.x issues no errors nor even warnings on this code. Seems like gcc 4.x.x

is more pedantic. Replace obstack_ptr_grow() (and obstack_int_grow()) macro

definition in obstack.h with the same from newer version of gdb:

# define obstack_ptr_grow(OBSTACK,datum) \

__extension__ \

({ struct obstack *__o = (OBSTACK); \

if (__o->next_free + sizeof (void *) > __o->chunk_limit) \

_obstack_newchunk (__o, sizeof (void *)); \

obstack_ptr_grow_fast (__o, datum); })

# define obstack_int_grow(OBSTACK,datum) \

__extension__ \

({ struct obstack *__o = (OBSTACK); \

if (__o->next_free + sizeof (int) > __o->chunk_limit) \

_obstack_newchunk (__o, sizeof (int)); \

obstack_int_grow_fast (__o, datum); })

# define obstack_ptr_grow_fast(OBSTACK,aptr) \

__extension__ \

({ struct obstack *__o1 = (OBSTACK); \

*(const void **) __o1->next_free = (aptr); \

__o1->next_free += sizeof (const void *); \

(void) 0; })

# define obstack_int_grow_fast(OBSTACK,aint) \

__extension__ \

({ struct obstack *__o1 = (OBSTACK); \

*(int *) __o1->next_free = (aint); \

__o1->next_free += sizeof (int); \

(void) 0; })

错误2:

/gdb-5.2.1/gdb/arm-tdep.c:2692: error: label at end of compound statement

解决方法:该版本 arm-tdep.c 2692一行default语句少了个分号!加上即可通过.

------------------------------------------------------------------------------

2.编译gdbserver过程(target服务器端)

#cd gdb/gdbserver

#./configure --host=arm-linux --target=arm-linux --prefix=/home/arm/gdb/output/ --nfp -v

#make CC=/usr/local/arm/3.4.1/bin/arm-linux-gcc

#make install

出错信息:

linux-arm-low.c:26:21: sys/reg.h: No such file or directory

make: *** [linux-arm-low.o] Error 1

解决方法:

删除gdb/gdbserver/linux-arm-low.c 中 #include .

-------------------------------------------------------------------------------

3.应用

这个gdb跟linux上的用法基本一样,如果不熟悉可以翻开资料复习一下.

学而时习之,不亦说乎哦...

温故而知新,可以为师矣哈:-)

调试:

arm上跑gdbserver,主机linux上就可以用arm-linux-gdb调试了.

#gdbserver 192.168.100.103:1234 hello

Process hello created; pid = 1583

Listening on port 1234

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译 gdbgdbserver for arm-linux-gnueabihf 可以按照以下步骤进行: 1. 下载 gdb-9.2 源代码包,可以从官网 http://www.gnu.org/software/gdb/ 或者其他镜像站点下载,也可以使用 wget 命令从命令行下载: ``` wget https://ftp.gnu.org/gnu/gdb/gdb-9.2.tar.gz ``` 2. 解压源代码包: ``` tar -zxvf gdb-9.2.tar.gz ``` 3. 进入源代码目录: ``` cd gdb-9.2 ``` 4. 创建编译目录: ``` mkdir build-arm cd build-arm ``` 5. 运行 configure 脚本生成 Makefile: ``` ../configure --target=arm-linux-gnueabihf --host=x86_64-linux-gnu ``` 注意:需要根据所使用的交叉编译工具链修改 target 参数,例如 arm-linux-gnueabi、arm-linux-gnueabihf 等。 6. 编译: ``` make ``` 7. 安装 gdb: ``` sudo make install ``` 注意:需要将编译出的 gdb 文件复制到 ARM 开发板上使用。 8. 进入 gdbserver 目录: ``` cd ../gdbserver ``` 9. 创建编译目录: ``` mkdir build-arm cd build-arm ``` 10. 运行 configure 脚本生成 Makefile: ``` ../configure --host=arm-linux-gnueabihf ``` 11. 编译 gdbserver: ``` make ``` 12. 安装 gdbserver: ``` sudo make install ``` 注意:需要将编译出的 gdbserver 文件复制到 ARM 开发板上使用。 13. 可以使用 arm-linux-gnueabihf-gdb 命令测试 gdb 是否安装成功,使用 arm-linux-gnueabihf-gdbserver 命令测试 gdbserver 是否安装成功。 注意:编译 gdbgdbserver 需要安装一些依赖库,例如 libncurses、libexpat、libreadline 等,可以使用包管理器安装或者手动编译安装,并且需要安装对应的交叉编译工具链。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值