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

作者:网络    软件教程库   2020-05-17

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

2015-05-02 lover雪儿

今天我们要学习的是使用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 ndash;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

[email#160;protected]雪:/home/study/nfs_home/system# tar -jxvf gdb-7.9.tar.bz2

[email#160;protected]雪:/home/study/nfs_home/system# cd gdb-7.9

[email#160;protected]雪:/home/study/nfs_home/system/gdb-7.9# mkdir ../../rootfs_imx257/arm-linux-gdb

[email#160;protected]雪:/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

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

[email#160;protected]雪:/home/study/nfs_home/system/gdb-7.9# make

[email#160;protected]雪:/home/study/nfs_home/system/gdb-7.9# make install

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

[email#160;protected]雪:/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/

[email#160;protected]雪:/home/study/nfs_home/system/gdb-7.9#

[email#160;protected]雪:/home/study/nfs_home/system/gdb-7.9# cd gdb

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

编译安装gdbserver

[email#160;protected]雪:/home/study/nfs_home/system/gdb-7.9/gdb# cd gdbserver/

[email#160;protected]雪:/home/study/nfs_home/system/gdb-7.9/gdb/gdbserver#

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

[email#160;protected]雪:/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

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

[email#160;protected]雪:/home/study/nfs_home/system/gdb-7.9# make

[email#160;protected]雪:/home/study/nfs_home/system/gdb-7.9# make install


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

[email#160;protected]雪:/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 http://gnu.org/licenses/gpl.html

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:

http://www.gnu.org/software/gdb/bugs/.

find the gdb manual and other documentation resources online at:

http://www.gnu.org/software/gdb/documentation/.

for help, type "help".

type "apropos word" to search for commands related to "word".

(gdb) q

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

[email#160;protected] /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"

[email#160;protected] /mnt/nfs/rootfs_imx257#

使用gdb和gdbserver远程调试程序

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

[email#160;protected]雪:/home/study/nfs_home/module/40_gdb_gdbserver_test# vi gdb_test.c

[email#160;protected]雪:/home/study/nfs_home/module/40_gdb_gdbserver_test#

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

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

进入我们安装的gdb的目录

[email#160;protected]雪:/home/study/nfs_home/module/40_gdb_gdbserver_test#

[email#160;protected]雪:/home/study/nfs_home/module/40_gdb_gdbserver_test#

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

[email#160;protected]雪:/home/study/nfs_home/rootfs_imx257/arm-linux-gdb/bin# ./arm-none-linux-gnueabi-gdb

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

[email#160;protected] /mnt/nfs/rootfs_imx257#

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

进入要运行的程序的目录

[email#160;protected] /mnt/nfs/rootfs_imx257# cd ../module/40_gdb_gdbserver_test/

[email#160;protected] /mnt/nfs/module/40_gdb_gdbserver_test# ls

gdb_test gdb_test.c make.sh

[email#160;protected] /mnt/nfs/module/40_gdb_gdbserver_test#

获取开发板当前的ip

[email#160;protected] /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

[email#160;protected] /mnt/nfs/module/40_gdb_gdbserver_test#

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

[email#160;protected] /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

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

当宿主机连接成功后

[email#160;protected] /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

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

当宿主机敲完命令后

[email#160;protected] /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

[email#160;protected]雪:/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命令

答案:

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

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

[email#160;protected]雪:/home/study/nfs_home/rootfs_imx257/arm-linux-gdb/bin#

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

注意gdb的目录

[email#160;protected]雪:/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; n100; n++);

10 }

11

12 void print(char *p, int cnt)

13 {

14 printf("%s cnt=%d\n",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)

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

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

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


如下所示:

[email#160;protected] /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

[email#160;protected] /mnt/nfs/module/40_gdb_gdbserver_test#

总结命令:

开发板的命令:

[email#160;protected] /mnt/nfs/module/40_gdb_gdbserver_test#

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


宿主机的命令:

[email#160;protected]雪:/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,
 5         unsigned int fsr, unsigned int sig, int code,
 6         struct pt_regs *regs)
 7 {
 8     struct siginfo si;
 9 
10 #ifdef config_debug_user    //1.配置内核
11     if (user_debug  udbg_segv) {
12         printk(kern_debug "%s: unhandled page fault (%d) at 0x%08lx, code 0x%03x\n",
13                tsk-comm, sig, addr, fsr);
14         show_pte(tsk-mm, addr);
15         show_regs(regs);
16     }
17 #endif
18 #############################################################
19 arch/alpha/kernel/traps.c
20 
21 2.uboot: set bootargs console=ttysac0 user_debug=0xff   //全部输出debug信息

配置的具体步骤:

[email#160;protected]雪:/home/study/nfs_home/system/linux-2.6.31# make menuconfig

输入/搜索 debug_user

结果:

│ symbol: debug_user [=n] │

│ prompt: verbose user fault messages │

│ defined at arch/arm/kconfig.debug:29 │

│ location: │

│ - kernel hacking │


首先选中

[*] kernel debugging

[*] verbose user fault messages //显示用户的错误信息

重新编译

[email#160;protected]雪:/home/study/nfs_home/system/linux-2.6.31# make uimage

烧写内核:



烧写完毕后,重新启动

进入开发板的u-boot

原来的参数保留,增加一项 user_debug=0xff

set bootargs user_debug=0xff

bootm 80800000 启动内核


执行应用程序,则会打印全部的错误信息.

当发生错误的时候,打印出栈信息

 1 在arch/arm/mm/fault.c中增加
 2 
 3 static void
 4 __do_user_fault(struct task_struct *tsk, unsigned long addr,
 5         unsigned int fsr, unsigned int sig, int code,
 6         struct pt_regs *regs)
 7 {
 8     struct siginfo si;
 9 
10 #ifdef config_debug_user    //1.配置内核
11     if (user_debug  udbg_segv) {
12         printk(kern_debug "%s: unhandled page fault (%d) at 0x%08lx, code 0x%03x\n",
13                tsk-comm, sig, addr, fsr);
14         show_pte(tsk-mm, addr);
15         show_regs(regs);
16     }
17 #endif
18 
19 int i=0;
20 ////////////////////////////////////////////////////////////
21     while(i1024)
22     {
23         if(copy_from_user(val, (const void __user *)(regs-arm_sp + i*4),4))
24             break;
25         printk("%08x",val);
26         i++;
27         if(i % 8 == 0)
28             printk("\n");
29     }
30     printk("\n end of statck\n");
31 /////////////////////////////////////////////////////////////


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

原文地址:http://www.cnblogs.com/lihaiyan/p/4471530.html

软件教程库 原文地址:https://www.itjcku.com/9999/1091466.html

阅读全部内容


Tags:调试分析使用远程开发

返回首页



推荐内容

限制Apache日志access.log文件大小

可以在apache的httpd.conf配置文件中配置apache自带的程序rotatelogs的功能。 rotate ...

UVa11561-GettingGold

题目:给你一个二维的地图,里面有陷阱‘t‘,金子‘g‘以及墙壁‘#‘,和普通的道路‘.‘,现在已知一个人在起点‘p‘; ...

configure:error:cannotcomputesuffixofobjectfiles:cannotcompile

centos 6.5下安装gcc-4.8.4 make的时候提示以下错误: configure: error: can ...

我读的第一本书《梦断代码》

一切都是兴趣所在,兴趣才是发展的动力,虽然我们在这个开发过程中不可否认的会遇到挫折、瓶颈,但我认为,地狱与天堂共存 ...

iOS中定时器NSTimer的使用

ios中定时器nstimer的使用 1、初始化 + (nstimer *)timerwithtimeinterval:( ...

数组遍历二叉

//任务二叉树遍历 void cmission::initmission(dword base) { cha ...

Oracle基础<1>--数据库设计

一:为什么需要使用数据库设计   数据库设计可以使数据库通过健壮的数据库结构 高效并且健康 的进行工作。 二.数据库设计 ...

LinuxShell之七函数应用

函数是什么?函数是一些命令的集合,使用一个名称做代表,称为函数名称。函数名称的命名规则和变量相同。一旦函数定义好了,执行 ...

SkillButton技能冷却

#pragmaonce #include"cocos2d.h" using_ns_cc; classskillbutto ...

sles11启用Xmanager

一:开启xmanager要满足一下2个条件:1.安装了gnome桌面环境,并且默认启动级别为52.ip地址为固定ip地址 ...

linux软件管理之rpm、yum

应用程序: 程序:architecturec语言:源代码——》(编译)二进制格式脚本:解释器(二进制程序)源代码——》编 ...

MyEclipse2014下搭建Android开发环境

1、下载android-sdk_r24.1.2-windows.zip,将其解压到一个文件夹中,例如:d:\progra ...

LinuxShell之八转向的用法

一、文件代码“转向”的意思是说:原本应由标准输入(如键盘)读取数据的,改由其它文件读取;原本应把结果显示在标准输出(如屏 ...

Java中有关null的9件事

java中有关 null 的9件事 对于java程序员来说,null是令人头痛的东西。时常会受到空指针异常(np ...

LDAP账号同步和Windows域集成验证

#65279;#65279; paradise.ezla.com.tw/files/article/html/32/32 ...

在同一个sql语句中如何写不同条件的count数量(转)

select sum(case when (t.条件字段=‘00‘) then 1 else 0 ...

详解MessageBox(),MsgBox函数的正确使用

//或者使用chr(13),chr(10)效果一样 msgbox aamp;chr(13)amp;bamp;chr( ...

swift学习笔记5

五、集合 数组 1、泛型 arraylt;类型gt; 2、简化[类型] var myar:arraylt;stringg ...

约在CBD,吃饭

午饭当然是外卖。 cbd上班的同仁们不用约,都去了一间叫大食堂的餐厅。 它在商业街繁华地段的二楼,有1000平米。你不知 ...

headFirst学习笔记之十:状态模式(5.2)

1.如何从状态图得到真正的代码: (1)找出所有状态:没有25分钱,有25分钱,糖果售罄,售出糖果。 (2)创建一个实例 ...

zabbixPHPdatabasessupportoffFail

zabbix初始化检查安装环境不通过: php databases support off fail --未找到所 ...

JS中字符串,数组常见操作

字符串mdash;mdash;mdash;》数组 abc =gt; ["a","b","c"]直接使用split方法 ...

IOS简单的动画自定义方法(旋转、移动、闪烁等)

#define kdegreestoradian(x) (m_pi * (x) /180.0) #define kra ...

swift学习笔记3-4

再牛逼的梦想,也抵不住你傻逼似的坚持! 我跑啊跑啊,为的就是赶上那个被寄予厚望的自己。 三、运算符+表达式 swift允 ...

Trie树初学

#includelt;cstdiogt; #includelt;cstringgt; #includelt;cstdli ...

Android--状态栏高度

干货 classlt;gt; c = null; object obj = null; field field = n ...

//hdu2222//AC自动机初学

// hdu2222 // #includelt;cstdiogt; #includelt;cstringgt; #in ...

黑书笔记

就从p77开始记好了.(稍微扩容) p77 排序. 1.香农信息论 基于比较的排序不可能突破o(nlogn)的复杂度限制 ...

//codeforces471D//kmp初学

// codeforces 471d // #includelt;cstdiogt; #includelt;cstrin ...

搭建基于域名虚拟主机

修改主配置文件 # cd /etc/httpd/conf.d/ # vim vhost.conf lt;virtu ...


本网站部分内容来自互联网,版权归原作者所有,文章内容仅代表原作者个人观点。如有侵权请联系我们删除 电子邮件 itjcku@foxmail.com