调试分析之 使用gdb远程调试ARM开发板

发布者:TranquilMind88最新更新时间:2024-08-13 来源: cnblogs关键字:调试分析  gdb  远程调试  ARM开发板 手机看文章 扫描二维码
随时随地手机看文章

今天我们要学习的是使用gdb和gdbserver来远程调试开发板程序.


下面是本人的一些具体步骤:


下载gdb-7.9.tar.gz地址:


http://ftp.gnu.org/gnu/gdb/gdb-7.9.tar.gz


安装gdb


tar -jxvf gdb-7.9.tar.bz2


./configure -target=arm-none-linux-gnueabi --prefix=/home/study/nfs_home/rootfs_imx257/arm-linux-gdb –program-prefix=arm-none-linux-gnueabi-


make


make install


安装gdbserver


./configure -target=arm-none-linux-gnueabi --prefix=/home/study/nfs_home/rootfs_imx257/arm-linux-gdbserver --host=arm-none-linux-gnueabi


make


make install


具体安装步骤如下:


编译安装gdb


root@Lover雪:/home/study/nfs_home/system# tar -jxvf gdb-7.9.tar.bz2


root@Lover雪:/home/study/nfs_home/system# cd gdb-7.9


root@Lover雪:/home/study/nfs_home/system/gdb-7.9# mkdir ../../rootfs_imx257/arm-linux-gdb


root@Lover雪:/home/study/nfs_home/system/gdb-7.9#


./configure -target=arm-none-linux-gnueabi --prefix=/home/study/nfs_home/rootfs_imx257/arm-linux-gdb --program-prefix=arm-none-linux-gnueabi-


checking build system type... x86_64-unknown-linux-gnu


checking host system type... x86_64-unknown-linux-gnu


checking target system type... arm-none-linux-gnueabi


###########################


root@Lover雪:/home/study/nfs_home/system/gdb-7.9# make


root@Lover雪:/home/study/nfs_home/system/gdb-7.9# make install


安装完毕发现多了一些文件夹


root@Lover雪:/home/study/nfs_home/system/gdb-7.9# ll ../../rootfs_imx257/arm-linux-gdb/


总用量 24


drwxr-xr-x 6 root root 4096 5月 2 06:34 ./


drwxrwxrwx 14 root root 4096 5月 2 06:11 ../


drwxr-xr-x 2 root root 4096 5月 2 06:34 bin/


drwxr-xr-x 3 root root 4096 5月 2 06:34 include/


drwxr-xr-x 2 root root 4096 5月 2 06:34 lib/


drwxr-xr-x 5 root root 4096 5月 2 06:34 share/


root@Lover雪:/home/study/nfs_home/system/gdb-7.9#


root@Lover雪:/home/study/nfs_home/system/gdb-7.9# cd gdb


###########################


编译安装gdbserver


root@Lover雪:/home/study/nfs_home/system/gdb-7.9/gdb# cd gdbserver/


root@Lover雪:/home/study/nfs_home/system/gdb-7.9/gdb/gdbserver#


mkdir /home/study/nfs_home/rootfs_imx257/arm-linux-gdbserver


root@Lover雪:/home/study/nfs_home/system/gdb-7.9/gdb/gdbserver#


./configure -target=arm-none-linux-gnueabi --prefix=/home/study/nfs_home/rootfs_imx257/arm-linux-gdbserver --host=arm-none-linux-gnueabi


configure: WARNING: If you wanted to set the --build type, don't use --host.


If a cross compiler is detected then cross compile mode will be used.


checking whether to enable maintainer-specific portions of Makefiles... no


checking for arm-none-linux-gnueabi-gcc... arm-none-linux-gnueabi-gcc


checking for C compiler default output file name... a.out


###########################


root@Lover雪:/home/study/nfs_home/system/gdb-7.9# make


root@Lover雪:/home/study/nfs_home/system/gdb-7.9# make install



进入安装目录运行gdb查看版本


loverxueer@Lover雪:/home/study/nfs_home/rootfs_imx257$ ./arm-linux-gdb/bin/arm-none-linux-gnueabi-gdb


GNU gdb (GDB) 7.9


Copyright (C) 2015 Free Software Foundation, Inc.


License GPLv3+: GNU GPL version 3 or later


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 '--host=x86_64-unknown-linux-gnu --target=arm-none-linux-gnueabi'.


Type 'show configuration' for configuration details.


For bug reporting instructions, please see:


.


Find the GDB manual and other documentation resources online at:


.


For help, type 'help'.


Type 'apropos word' to search for commands related to 'word'.


(gdb) q


进入开发板目录,再开发板上运行gdbserver查看版本


root@EasyARM-iMX257 /mnt/nfs/rootfs_imx257# ./arm-linux-gdbserver/bin/arm-none-l


inux-gnueabi-gdbserver --version


GNU gdbserver (GDB) 7.9


Copyright (C) 2015 Free Software Foundation, Inc.


gdbserver is free software, covered by the GNU General Public License.


This gdbserver was configured as 'arm-none-linux-gnueabi'


root@EasyARM-iMX257 /mnt/nfs/rootfs_imx257#


使用gdb和gdbserver远程调试程序


附上应用程序gdb_test.c



 1 #include

 2 

 3 char *p = 'hello,this is test gdb & gdbserver ';

 4 

 5 void delay(int m)

 6 {

 7     int n;

 8     while(m--)

 9         for(n =0; n<100; n++);            

10 }

11 

12 void print(char *p, int cnt)

13 {

14     printf('%s cnt=%dn',p,cnt);

15 }

16 

17 int  main(void)

18 {

19     int cnt = 0;

20     while(1)

21     {

22         cnt++;

23         print(p,cnt);

24         delay(100000);

25     }

26     return 0;

27 }


首先再开发板写好写程序.编译


root@Lover雪:/home/study/nfs_home/module/40_gdb_gdbserver_test# vi gdb_test.c


root@Lover雪:/home/study/nfs_home/module/40_gdb_gdbserver_test#


arm-none-linux-gnueabi-gcc -g gdb_test.c -o gdb_test


这里注意一定要加 -g 选项


进入我们安装的gdb的目录


root@Lover雪:/home/study/nfs_home/module/40_gdb_gdbserver_test#


root@Lover雪:/home/study/nfs_home/module/40_gdb_gdbserver_test#


cd /home/study/nfs_home/rootfs_imx257/arm-linux-gdb/bin/


root@Lover雪:/home/study/nfs_home/rootfs_imx257/arm-linux-gdb/bin# ./arm-none-linux-gnueabi-gdb


 


连接开发板,在开发板操作步骤如下:


 


root@EasyARM-iMX257 /mnt/nfs/rootfs_imx257#


cp arm-linux-gdbserver/bin/arm-none-linux-gnueabi-gdbserver /bin/


进入要运行的程序的目录


root@EasyARM-iMX257 /mnt/nfs/rootfs_imx257# cd ../module/40_gdb_gdbserver_test/


root@EasyARM-iMX257 /mnt/nfs/module/40_gdb_gdbserver_test# ls


gdb_test gdb_test.c make.sh


root@EasyARM-iMX257 /mnt/nfs/module/40_gdb_gdbserver_test#


获取开发板当前的ip


root@EasyARM-iMX257 /mnt/nfs/module/40_gdb_gdbserver_test# ifconfig


eth0 Link encap:Ethernet H


inet addr:192.168.31.181


Bcast:192.168.31.255 Mask:255.255.255.0


UP BROADCAST ric:1


RX packets:720 errors:0 dropped:0 overruns:0 frame:0


TX packets:105 errors:0 dropped:0 overruns:0 carrier:0


collisions:0 txqueuelen:1000


RX bytes:950466 (928.1 KiB) TX bytes:18426 (17.9 KiB)


Base address:0x2000


root@EasyARM-iMX257 /mnt/nfs/module/40_gdb_gdbserver_test#


开始运行gdbserver监控,监控端口随便写,此处为1234


root@EasyARM-iMX257 /mnt/nfs/module/40_gdb_gdbserver_test# arm-none-linux-gnueab


i-gdbserver 192.168.31.181:1234 ./gdb_test


Process ./gdb_test created; pid = 1816


Listening on port 1234


######################################################################################


当宿主机连接成功后


root@EasyARM-iMX257 /mnt/nfs/module/40_gdb_gdbserver_test# arm-none-linux-gnueab


i-gdbserver 192.168.31.181:1234 ./gdb_test


Process ./gdb_test created; pid = 1816


Listening on port 1234


Remote debugging from host 192.168.31.179 远程连接来自 192.168.31.179


######################################################################################


当宿主机敲完命令后


root@EasyARM-iMX257 /mnt/nfs/module/40_gdb_gdbserver_test# arm-none-linux-gnueab


i-gdbserver 192.168.31.181:1234 ./gdb_test


Process ./gdb_test created; pid = 1816


Listening on port 1234


Remote debugging from host 192.168.31.179


hello,this is test gdb & gdbserver cnt=1


hello,this is test gdb & gdbserver cnt=2


hello,this is test gdb & gdbserver cnt=3


 


接着在 宿主机上运行gdb来连接gdbserver,进行调试.


 


步骤如下:


 


注意gdb的目录


运行gdb


loverxueer@Lover雪:/home/study/nfs_home/rootfs_imx257$ ./arm-linux-gdb/bin/arm-none-linux-gnueabi-gdb


GNU gdb (GDB) 7.9


Copyright (C) 2015 Free Software Foundation, Inc.


Type 'apropos word' to search for commands related to 'word'.


(gdb)


开始连接gdbserver,IP:端口号


(gdb) target remote 192.168.31.181:1234


Remote debugging using 192.168.31.181:1234


0x400007e0 in ?? ()


(gdb) l


没有符号表被读取。请使用 'file' 命令。


(gdb) c


######################################################################################


大家有没有发现,这样是连通了,也可以使用C命令运行,但是却无法使用list和break命令


答案:


因为调试的信息是从本地的文件中读取的,所以,宿主目录和开发板要进入同一个程序目录下,进行调试


所以再开发部上进入我的程序目录


root@Lover雪:/home/study/nfs_home/rootfs_imx257/arm-linux-gdb/bin#


cd /home/study/nfs_home/module/40_gdb_gdbserver_test/


注意gdb的目录


loverxueer@Lover雪:/home/study/nfs_home/module/40_gdb_gdbserver_test$


/home/study/nfs_home/rootfs_imx257/arm-linux-gdb/bin/arm-none-linux-gnueabi-gdb


GNU gdb (GDB) 7.9


Copyright (C) 2015 Free Software Foundation, Inc.


(gdb) target remote 192.168.31.181:1234


Remote debugging using 192.168.31.181:1234


0x400007e0 in ?? ()


(gdb) l


没有符号表被读取。请使用 'file' 命令。


######################################################################################


(gdb) symbol-file ./gdb_test


加载本地目录下的文件的信号表


Reading symbols from ./gdb_test...done.


(gdb) l


5 void delay(int m)


6 {


7 int n;


8 while(m--)


9 for(n =0; n<100; n++);


10 }


11


12 void print(char *p, int cnt)


13 {


14 printf('%s cnt=%dn',p,cnt);


(gdb) b 22


Breakpoint 1 at 0x83fc: file gdb_test.c, line 22.


(gdb)


(gdb) c


Continuing.



Breakpoint 1, main () at gdb_test.c:22


22 cnt++;


(gdb) c


Continuing.



Breakpoint 1, main () at gdb_test.c:22


22 cnt++;


(gdb) c


Continuing.



Breakpoint 1, main () at gdb_test.c:22


22 cnt++;


(gdb) c


Continuing.



Breakpoint 1, main () at gdb_test.c:22


22 cnt++;


(gdb) print cnt


$1 = 3


(gdb) target exec


A program is being debugged already. Kill it? (y or n) y


No executable file now.


(gdb)


此时再看我们的开发板的串口窗口


######################################################################################


######################################################################################



如下所示:


root@EasyARM-iMX257 /mnt/nfs/module/40_gdb_gdbserver_test# arm-none-linux-gnueab


i-gdbserver 192.168.31.181:1234 ./gdb_test


Process ./gdb_test created; pid = 1816


Listening on port 1234


Remote debugging from host 192.168.31.179


hello,this is test gdb & gdbserver cnt=1


hello,this is test gdb & gdbserver cnt=2


hello,this is test gdb & gdbserver cnt=3


Killing all inferiors


root@EasyARM-iMX257 /mnt/nfs/module/40_gdb_gdbserver_test#


 


总结命令:


 


开发板的命令:


root@EasyARM-iMX257 /mnt/nfs/module/40_gdb_gdbserver_test#


arm-none-linux-gnueabi-gdbserver 192.168.31.181:1234 ./gdb_test



宿主机的命令:


loverxueer@Lover雪:/home/study/nfs_home/module/40_gdb_gdbserver_test$


/home/study/nfs_home/rootfs_imx257/arm-linux-gdb/bin/arm-none-linux-gnueabi-gdb



(gdb) target remote 192.168.31.181:1234



(gdb) symbol-file ./gdb_test 注意这个是调试程序的文件所在


(gdb) l


(gdb) b 20


(gdb) c


(gdb) target exec


 


配置内核输出应用程序的段错误信息


 1 arch/arm/mm/fault.c

 2 

 3 static void

 4 __do_user_fault(struct task_struct *tsk, unsigned long addr,

[1] [2]
关键字:调试分析  gdb  远程调试  ARM开发板 引用地址:调试分析之 使用gdb远程调试ARM开发板

上一篇:imx257下实现I2C驱动的四种方法
下一篇:调试分析之 修改内核来定位系统僵死问题

推荐阅读最新更新时间:2026-03-22 11:11

嵌入式Linux的GDB远程调试的实现
  远程调试环境由宿主机GDB和目标机调试stub共同构成,两者通过串口或TCP连接。使用GDB标准远程串行协议协同工作,实现对目标机上的系统内核和上层应用的监控和调试功能。调试stub是嵌入式系统中的一段代码,作为宿主机GDB和目标机调试程序间的一个媒介而存在。     就目前而言,嵌入式Linux系统中,主要有三种远程调试方法,分别适用于不同场合的调试工作:用ROM Monitor调试目标机程序、用KGDB调试系统内核和用gdbserver调试用户空间程序。这三种调试方法的区别主要在于,目标机远程调试stub的存在形式的不同,而其设计思路和实现方法则是大致相同的。     而我们最常用的是调试应用程序。就是采用gdb+gdbs
[单片机]
OK6410A 开发板 (八) 82 linux-5.11 OK6410A arm-gdb+JLinkGDBServer+Jlink+JTAG接口 调试 linux
windows 上用 JLinkGDBServer.exe 架设 服务器端,直接控制 jink驱动,并用usb连接ok6410 linux 上 用 arm-linux-gnueabi-gdb 连接 JLinkGDBServer 在 arm-linux-gnueabi-gdb 窗口中控制 JLinkGDBServer ,从而控制 s3c6410的运行 实操: 断点功能是OK的 让 s3c6410 启动到 u-boot 的 cmdline,并进入交互 启动JLinkGDBServer ,将 s3c6410 停住(halt) arm-linux-gnueabi-gdb 连接 JLinkGDBServer ,并设置断点(b s
[单片机]
OK6410A <font color='red'>开发板</font> (八) 82 linux-5.11 OK6410A <font color='red'>arm</font>-<font color='red'>gdb</font>+JLinkGDBServer+Jlink+JTAG接口 <font color='red'>调试</font> linux
OK6410A 开发板 (八) 84 linux-5.11 OK6410A arm-gdb+kgdb+串口 调试 linux
理论知识 调试过程 调试过程都是 这样子的 : 让核心停下来,查询信息,让核心继续运行 我们看一下 kgdb 是怎么做的 kgdb: 让核心停下来: 1. linux启动前期会自动进入kgdb 或 2. linux启动完成,挂载了procfs,用echo g /proc/sysrq-trigger 来进入 kgdb 查询信息 1. bash#gdb vmlinx 2. gdb target remote /dev/ttyS0 3. gdb set remotebaud 115200 // set serial baud 115200 4. gdb bt // 查询信息 6. gdb
[单片机]
嵌入式系统的远程调试方法介绍
1 基本方法 图1(a)是传统的嵌入式调试方法:主机PC通过串口与从机嵌入式系统相连,接收从嵌入式系统发来的调试信息并向嵌入式系统发送调试指令,主机和从机之间只能有几米或者几十米的距离。图1(b)是现在比较流行的远程嵌入式调试方法:主机PC和从机嵌入式系统分别通过以太网连接到网络上,主机通过诸如Telnet之类的协议向嵌入式系统接收调试信息和发送指令。本文介绍的方法是将这两者结合起来,位于远端的嵌入式系统与其相邻的PC2通过串口相连,主机PC1和从机PC2各自通过以太网连接到网络上,主机PC1仍然通过Telnet协议(使用Windows自带的“超级终端”程序)与从机PC2通信,在从机PC2上运行一种我们设计的软件Telent2c
[单片机]
嵌入式系统的<font color='red'>远程</font><font color='red'>调试</font>方法介绍
基于ARM&Linux的嵌人式设备远程调试模块设计
0 引 言 目前,大多数的工业设备都有专用的调试接口和调试软件,这种方式能有效解决系统现场调试和维护升级的问题,但也有一些弊端。首先,依赖专用的调试软件,随着产品的丰富,调试软件的版本也随之增加,从而工程人员需要面对软件匹配的麻烦;其次,专用的调试接口和配备专用的调试软件需要专业人员操作,用户无法灵活地使用设备。因此需要一种无需专用设备,方便、易行的设备调试方案。随着计算机技术的发展,以ARM为代表的微处理器的性能得到极大的提高,从而提高了嵌入式系统的性能,应用范围也更加广阔;而网络技术的发展,使得B/S(客户端/服务器)模式成为一种潮流。这两者的结合便为设备的现场调试方式提供了新的方案。工程人员只需要连接Internet的设备
[单片机]
基于<font color='red'>ARM</font>&Linux的嵌人式设备<font color='red'>远程</font><font color='red'>调试</font>模块设计
嵌入式系统的远程调试
1 基本方法 图1(a)是传统的嵌入式调试方法:主机PC通过串口与从机嵌入式系统相连,接收从嵌入式系统发来的调试信息并向嵌入式系统发送调试指令,主机和从机之间只能有几米或者几十米的距离。图1(b)是现在比较流行的远程嵌入式调试方法:主机PC和从机嵌入式系统分别通过以太网连接到网络上,主机通过诸如Telnet之类的协议向嵌入式系统接收调试信息和发送指令。本文介绍的方法是将这两者结合起来,位于远端的嵌入式系统与其相邻的PC2通过串口相连,主机PC1和从机PC2各自通过以太网连接到网络上,主机PC1仍然通过Telnet协议(使用Windows自带的“超级终端”程序)与从机PC2通信,在从机PC2上运行一种我们设计的软件Telent2
[嵌入式]
一种软硬结合的嵌入式系统远程调试方法
摘要:介绍一种软硬件相结合来实现嵌入式系统远程调试的方法。其主要思想是,通过使用一个程序将串口和Telnet协议进行转换,主机通过Telnet从远端访问与嵌入式系统用串口直接相连的PC机,从而间接访问到嵌入式系统,获得调试信息、发送指令和更新固件;同时,通过附加的硬件电路,完成远端对嵌入式系统的电源和I/O的控制,从而获得更为全面的调试手段。 关键词:多维力传感器 MSC1210 微位移检测 引 言   随着全球化的进程,越来越多的嵌入式系统的设计工作可能由地处两个相距很远地方甚至两个国家的设计团队共同完成,或者设计在一个地方完成,制造在另外一个地方完成。于是,就有了这样一种情况,一个地方的工程师需要对处在另一个遥远地方的嵌
[应用]
迅为i.MX6ULL开发板移植Gdb+Gdbserver调试
因为有很多小伙伴是从单片机转过来的,用惯了单片机使用JLINk来调试程序,换到Linux非常不习惯。确实是如此,如果能在Linux上能设置断点,单步调试,查看变量,那就再好不过了。那么接下来将教大家怎么在arm板上调试应用代码的方法。 首先,了解下基本的思路: 采用这种方式进行远程调试,目标系统必须包括gdbserver程序,宿主机也必须安装gdb程序。一般Linux发行版中都有一个可以运行的gdb,但我们不能直接使用该发行版中的gdb来做远程调试,而要获取gdb的源代码包,针对arm平台做一个简单的配置,重新编译得到相应的gdb,如armv4. 搭建环境 UBuntu版本:Ubuntu 12.04 交叉编译器:arm-200
[单片机]
迅为i.MX6ULL<font color='red'>开发板</font>移植<font color='red'>Gdb</font>+Gdbserver<font color='red'>调试</font>
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved