交叉调试 arm linux,搭建交叉调试环境Arm-Linux-Gdb与gdbserver

操作系统:Ubuntu9.04 开发板:博创2410s 交叉编译工具:arm-linux-gcc-4.1.1 gdb+gdbserver 是调试目标板的常用方法.

网络环境如下:HOST 192.168.1.123  Target: 192.168.1.21

NFS共享目录: mount -t nfs -o intr,nolock,rsize=1024,wsize=1024 192.168.1.123:/home/www.linuxidc.com/arm2410s /tmp

天蓝色:命令 紫色:命令运行结果 红色:需要注意的

1、准备工作

建立安装目录,并修改目录权限

[email protected]:~$ sudo mkdir -p /opt/crosstool/arm-gdb

[email protected]:~$ sudo chown -R www.linuxidc.com /opt/crosstool/arm-gdb

下载gdb-6.5.tar.bz2(或者更新版的gdb)

2、编译arm-linux-gdb gdb-6.5使用了autoconf/automake。因此,通过设置configure脚本的--target,--host,--prefix参数就可以方便的移植到别的平台。 --target指定了需要调试的目标机环境,一般设置为交叉编译器的前缀,比如--target=arm-linux, --target=mips-linux,--target=armv5-linux-uclibc, --target的缺省值为i386-linux, 也就是i386PC机 --host指定编译后的文件的运行环境,取值可以是i386-linux或者交叉编译器的前缀,缺省为i386-linux --prefix指定要安装的目录。

[email protected]:~/downloads$ tar jxvf gdb-6.5.tar.bz2

[email protected]:~/downloads$ cd gdb-6.5

[email protected]:~/downloads/gdb-6.5$ ./configure --target=arm-linux --prefix=/opt/crosstool/arm-gdb

[email protected]:~/downloads/gdb-6.5$ make

[email protected]:~/downloads/gdb-6.5$ sudo make install

[email protected]:~/downloads/gdb-6.5$ ls /opt/crosstool/arm-gdb/bin arm-linux-gdb  arm-linux-gdbtui  arm-linux-run安装后,在/opt/crosstool/arm-gdb/bin可以看到arm-linux-gdb、arm-linux-gdbtui、arm-linux-run等

配置环境变量

[email protected]:~/downloads/gdb-6.5$ vi ~/.bashrc

在文件最后加上

if [ -d /opt/crosstool/arm-gdb/bin ]; then

PATH=/opt/crosstool/arm-gdb/bin:$PATH

fi使刚配置的环境变量生效

[email protected]:~/downloads/gdb-6.5$ source ~/.bashrc

3、编译gdbserver

[email protected]:~/downloads/gdb-6.5$ cd ../gdb-6.5/gdb/gdbserver

[email protected]:~/downloads/gdb-6.5/gdb/gdbserver$ ./configure --target=arm-linux --host=arm-linux

[email protected]:~/downloads/gdb-6.5/gdb/gdbserver$ make CC=/opt/crosstool/gcc-4.1.1-glibc-2.3.2/arm-linux/bin/arm-linux-gcc #这里是交叉编译器的路径

[email protected]:~/downloads/gdb-6.5/gdb/gdbserver$ ls

可以看到刚刚生成的gdbserver,将其拷贝到nfs共享目录下,因为gdbserver最终是在目标机上运行。

[email protected]:~/downloads/gdb-6.5/gdb/gdbserver$  cp gdbserver ~/arm2410s

4、拷贝libthread库(这一步不做的话,运行gdbserver会出错!)

[email protected]:~/downloads/gdb-6.5/gdb/gdbserver$ cd /opt/crosstool/gcc-4.1.1-glibc-2.3.2/arm-linux/arm-linux/lib

[email protected]:/opt/crosstool/gcc-4.1.1-glibc-2.3.2/arm-linux/arm-linux/lib$ ls -l libthread_db* -rwxr-xr-x 1 www.linuxidc.com www.linuxidc.com 28092 2009-12-29 18:51 libthread_db-1.0.so

lrwxrwxrwx 1 www.linuxidc.com www.linuxidc.com    17 2009-12-29 18:51 libthread_db.so -> libthread_db.so.1

lrwxrwxrwx 1 www.linuxidc.com www.linuxidc.com    19 2009-12-29 18:51 libthread_db.so.1 -> libthread_db-1.0.so

将libthread_db-1.0.so拷贝到nfs共享目录下,我的是~/arm2410s,~/arm2410s/lib是我的外部库存放位置(我的跟文件系统是cramfs,无法直接拷贝到目标板的/lib)

[email protected]:/opt/crosstool/gcc-4.1.1-glibc-2.3.2/arm-linux/arm-linux/lib$ mkdir ~/arm2410s/lib

[email protected]:/opt/crosstool/gcc-4.1.1-glibc-2.3.2/arm-linux/arm-linux/lib$ cp libthread_db-1.0.so ~/arm2410s/lib

[email protected]:/opt/crosstool/gcc-4.1.1-glibc-2.3.2/arm-linux/arm-linux/lib$ cd ~/arm2410s/lib

[email protected]:~/arm2410s/lib$ ln -s libthread_db-1.0.so libthread_db.so.1

[email protected]:~/arm2410s/lib$ ln -s libthread_db-1.0.so libthread_db.so

然后 在你在开发板上运行gdbserver前,先设置一下库文件搜索路径LD_LIBRARAY_PATH

minicom下

[email protected]:/# mount -t nfs -o intr,nolock,rsize=1024,wsize=1024 192.168.1.123:/home/www.linuxidc.com/arm2410s /tmp

[email protected]:/# export LD_LIBRARAY_PATH=${LD_LIBRARAY_PATH}:/tmp/lib

若根文件系统非只读文件系统,那你大可以直接将libthread_db-1.0.so拷贝到开发板的/lib或/usr/lib,然后建立相应的符合链接

4、测试

写一个程序,  用arm-linux-gcc -g 编译, 放到nfs共享目录/home/www.linuxidc.com/arm2410s目录下,我的程序名为gprs

minicom下

[email protected]:/# cd /tmp

[email protected]:/tmp# ./gdbserver 192.168.1.123:6666 gprs

Process gprs created; pid = 825

Listening on port 6666

其中,gpbserver使用方法: gpbserver 主机ip地址:通信端口 要调试的程序 【程序的命令行参数】 程序的命令行参数是可选的

启动一个终端,运行如下命令

[email protected]:~$ cd arm2410s/

[email protected]:~/arm2410s$  arm-linux-gdb gprs

GNU gdb 6.5

Copyright (C) 2006 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 "--host=i686-pc-linux-gnu --target=arm-linux"...

(gdb) target remote 192.168.1.21:6666           #连接目标: target remote 开发板ip地址:通信端口

Remote debugging using 192.168.1.21:6666

0x40001330 in ?? ()

(gdb)

此时,开发板终端可以看到应答信息Remote debugging from host 192.168.1.123

[email protected]:/tmp# gdbserver 192.168.1.123:6666 gprs

Process gprs created; pid = 825

Listening on port 6666

Remote debugging from host 192.168.1.123

现在就可以通过l查看程序源码, 然后b设置断点了;运行则用命令c。

5、常用的GDB命令:

load:装入一个程序

symbol-file:装入符号库文件,可以是用-g参数编译的可执行文件。

f(ile):指定一个可执行文件进行调试,gdb将读取些文件的调试讯息,如f a.exe

l(ist):列程序出源文件

r(un) :装载完要调试的可执行文件后,可以用run命令运行可执行文件

b(reak):设置断点(break point),如b 25,则在源程序的第25行设置一个断点,当程序执行到第25行时,就会产生中断;也可以使用b funcname,funcname为函数的名称,

当程序运行到��点停下来时,

c(ontinue):c命令可以另中断的程序继续执行,直到下一个中断点或程序结束

p(rint):输入某个变量的值,如程序定义了一个int a的就是,p a就会输出aa的当前值

n(ext):程序执行到断点时中断执行,可以用n指令进行单步执行

s(tep):程序执行到断点时中断执行,可以用s指令进行单步执行进某一函数

q(uit):退出GDB

使用简化命令,如l,和完整命令list,效果是一样的。

6、需要注意的问题 1)、简化命令f不一定能用,gdb会提示

(gdb) f gprs

No symbol table is loaded.  Use the "file" command.

可用完整命令file代替 (gdb) file gprs

Reading symbols from /home/www.linuxidc.com/arm2410s/gprs...done.

2)、交错调试时我们不使用r(un)来执行程序。 因为执行完target remote命令后,目标板程序已经在运行,所有应该用continue命令而不是run命令。如果你选择了重新运行程序,gdb会提示不知道怎么运行程序, 因为开发板那边gpbserver已经“Killing inferior”退出了.

(gdb) r

The program being debugged has been started already.

Start it from the beginning? (y or n) y

Starting program: /home/www.linuxidc.com/arm2410s/gprs

Don't know how to run.  Try "help target".

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/528499.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sql server linux性能,详细了解SQL Server 2008性能和性能优化

在SQL Server 2005或更早的版本中的中,表变量是不能作为存储过程的参数的。当多行数据到SQL Server需要发送多行数据到SQL Server ,开发者要么每次发送一列记录,或想出其他的变通方法,以满足需求。虽然在.net 2.0中提供了个SQLBul…

开发linux显卡驱动,显卡驱动开发DRM入门--Apple的学习笔记

由于之前的blog提及kmscube的源码我没有找到,所以只能在网上搜索了。DRM简介DRM是Linux目前主流的图形显示框架,同时DRM可以统一管理GPU和Display驱动,使得软件架构更为统一,方便管理和维护。而且drm是集成在linux kernel中的。DR…

linux 中w和x 区别,r、w、x权限在文件和目录中的含义有何区别?

age 于 2011-01-11 17:48:39发表:目录和文件的rw权限基本一致, 唯一有区别的可能就是执行权限了文件的可执行权限很好理解, 最简单的理解就是可以在终端下输入路径来执行这个文件.但目录可执行的意思则完全不同, 它并非指这个目录可以被执行. 而是指它允许在该目录下运行可执行…

linux ppp漏洞,Linux下ppp拨号的实现(Arm)

Linux发行版自带PPP拨号需要的pppd和chat命令,以2.6.18内核的Linux虚拟机为例,在/usr/sbin目录下,/etc/ppp目录也已自动创建。参考模权创建拨号脚本ppp-on,ppp-off,ppp-on-dialer三个文件,on&off放在/u…

c语言学生成绩管理论文,学生成绩管理系统毕业论文c语言.doc

111111111学院毕 业 论 文题 目 学生成绩管理系统姓 名 1 1 1所在系别 计 算 机 系专业班级 计算机应用技术计算机111班学 号 1111111111指导教师 1 1 1日 期 2012 年 4 月 15 日目 录摘 要 ………………………………………………………………………………………………………1…

编程语言基础 c语言同步教案,C语言程序设计基实验教案.doc

C语言程序设计基实验教案高级语言程序设计基础实验主讲教师:张顺利2011年10月,其中。2.将China译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母。例如,字母A后面第四个字母是E,用…

c语言char转cstring,CString、TCHAR*、char*转换 | 时刻需

char*、TCHAR*转换CStringCString str(****)下面详细写一下其它转换///************************************************************************* 函数: TransCStringToTCHAR* 描述:将CString 转换为 TCHAR** 日期:*********************…

c语言的c语句ab2,当初我在重庆交通大学读书的时候C语言成绩也相当不错的

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼楼主,感激不尽。1、C语言数组下标默认从 ______开始。2、C语言全局变量的存储值类型可以是exlern和_______3、结构化程序设计的三种基本结构分别指的是顺序结构、_____和_____4、若有定义imb2,c0执行下面的表…

android mvc使用方法,详细学习android mvc设计模式教程

MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 web 应用程序的模式。其分层有助于管理复杂的应用程序,因为可以在一个时间内专门关注一个方面。例如,可以在不依赖业务逻辑的情况下专注于视图设计。同时也让应用程序的测试更加容易…

android l 电池,DIY新技能--M1L换电池

DIY新技能--M1L换电池2019-10-23 16:48:526点赞6收藏10评论更换理由M1L是好几年前买的了,具体几年前我都懒得购买记录了。前前后后买了4台锤子手机了,这是我支持老罗的第二款手机,前一款是坚果手机,买了两台早先给妈妈用一台后来给…

android版本10好不好,一加正式推送Android 10系统 流畅性怎么样

近日,一加正式推送Android 10系统,不知道流畅性如何呢?一加官方推特正式宣布Android 10系统已进行阶段性推送,从今天开始一加7和一加7 Pro手机用户将会陆续收到氧OS系统的更新,国内基于Android 10的氢OS将于下月推送。…

android 移除fragment,Android Viewpager+Fragment取消预加载及Fragment方法的学习

1.在使用ViewPager嵌套Fragment的时候,由于VIewPager的几个Adapter的设置来说,都会有一定的预加载。通过设置setOffscreenPageLimit(int number) 来设置预加载的熟练,在V4包中,默认的预加载是1,即使你设置为0&#xff…

r语言 html表格,R语言table()函数

R语言table()函数比较有用,两个示例尤其是混淆矩阵这个案例比较有用:例子一:统计频次zz1#实现z中各数据频次的统计z1 2 4 73 3 1 1names(z1)#居然是有名字的[1] "1" "2" "4" "7"例子二:实…

android屏幕适配流程,Android屏幕适配姿势

GitHub地址为什么要屏幕适配?device_framentation.png统计碎片化品牌机型碎片化屏幕尺寸碎片化操作系统碎片化为了保证用户获得一致的用户体验效果,使得某一元素在Android不同尺寸、不同分辨率的手机上具备相同的显示效果,则需要我们进行屏幕…

在html中写js提示错误,页面HTML标签优化

真正需要SEOer掌握并经常使用的HTML标签也就那么几个,本小节错误君带来的是页面HTML标签优化。title标签 – 标题标签1)title标签用法2.13 TF-IDF加权方法 – 错误教程2)标题标签的作用文章标题有着关键词的作用,文章标题引点击流量。3)页面标题标签优化…

在线聊天室html5源码,HTML5WebSocket实现聊天室的代码示例

本篇文章主要介绍了HTML5-WebSocket实现聊天室示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。在传统的网页实现聊天室的方法是通过每隔一段时间请求服务器获取相关聊天信息来实现,然而html5带来的websocket功能改变这了这种方式&am…

android人脸情绪识别器,基于Android平台的人脸表情识别系统的设计与实现

摘要:随着目前移动设备硬件技术的不断发展,其性能与PC的差距越来越小,这使得在嵌入式平台上进行图像处理成为了可能.目前使用最广泛的是基于Android系统的嵌入式平台,与之相关的图像类应用需求也渐渐增多,如图片文字识别,人脸识别等等.而近年来,人脸表情识别技术成为…

android删除键监听,「React Native」Android返回键监听

在需要做监听的js中添加componentWillMount() {if (Platform.OS android) {BackHandler.addEventListener(hardwareBackPress, this.onBackHandler);}}componentWillUnmount() {if (Platform.OS android) {BackHandler.removeEventListener(hardwareBackPress, this.onBackHa…

列表页时间日期标签靠显示html,帝国CMS列表页面list.var分别调用年月日,显示个性时间日期...

在帝国CMS中列表页个性时间显示的实现方式,首先我们要知道用什么方法来实现,这里我们使用PHP代码来做。要在模板代码中使用PHP代码,就必须勾选此模板代码页面的-使用程序代码.位置就在添加模板页面的列表内容模板(list.var) (*)上边。然后我们在list.var…

html鼠标响应事件吗,学习JavaScript鼠标响应事件

本文为大家分享了一个简单的鼠标模拟案例,供大家参考,具体实现内容如下如何实现捕抓鼠标事件,当鼠标滑动时,获取当前鼠标的坐标,接着在一个透明区域里绑定捕抓的位移,这样就能在模拟的透明区域里实现鼠标滑…