GDB调试基础

一.调试环境

一般的GDB调试为本机环境下调试,如在一台Centos6的服务器上编写demo,那么gdb调试时只需要运行gdb工具并指定待调试文件即可开始调试;

如:

[xxx@centos6]$ gdb a.out 
//……
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/a.out...done.
(gdb) 
(gdb) b add3
Breakpoint 1 at 0x4004d1: file /home/exe_demo.c, line 5.
(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000004004d1 in add3 at /home/exe_demo.c:5

然而在嵌入式开发中常见的是demo需要在嵌入式设备端运行并调试,一般情况下基本的条件是:demo使用嵌入式设备soc厂商提供的交叉编译器X编译、嵌入式设备与服务器通过串口\网络进行通信。

那么就需要gdbserver,gdbserver是调试用户空间程序的工具,允许gdb和被调试程序分别在两个机器上运行。使用方法可以参考——gdbserver使用简介、gdb+gdbserver远程调试环境搭建及调试

通常情况下gdbserver和交叉编译器都是配套的,由soc厂商提供;

以下示例:

1.nfs挂载,方便将gdbserver工具的待调试程序拷贝到嵌入式设备中;

mount -t nfs -o nolock,tcp 192.168.1.100:/home/nfs/ /home

2.设备端运行gdbserver工具 [gdbserver] [IP]:[端口号] [待调试程序]

/home/# /home/gdb/gdbserver-XSoC 192.168.1.100:6688 exe_demo
Process /home/exe_demo created; pid = 1979
Listening on port 22228

3.服务器端运行gdb工具[gdb] [待调试程序],通过TCP与嵌入式设备通信:target remote [IP]:[端口号]

[xxx@centos6]$ arm-XSoC-linux-gdb ./build/exe_demo
//……
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./build/exe_demo...done.
(gdb)
(gdb) target remote 192.168.1.100:6688
Remote debugging using 192.168.1.100:6688
Reading symbols from /opt/arm-XSoC-linux/arm-XSoC-linux-9.1.0/arm-XSoC-linux/sysroot/lib/ld-uClibc.so.0...(no debugging symbols found)...done.
0xb6feaea4 in _start () from /opt/arm-XSoC-linux/arm-XSoC-linux-9.1.0/arm-XSoC-linux/sysroot/lib/ld-uClibc.so.0
(gdb) 

二、调试命令

  1. b 下断点
//1.1 通过文件名+行号 下断点:
(gdb) b 03StackAnaly.c:11
Breakpoint 1 at 0x10668: file /home/exe_demo.c, line 11.
//1.2 通过函数名下点断,注意C++的需要把函数作用域一起加上
(gdb) b add3 
Breakpoint 2 at 0x1063c: file /home/exe_demo.c, line 5.
//info b查看断点信息
(gdb) info b
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x00010668 in add5 at /home/exe_demo.c:11
2       breakpoint     keep y   0x0001063c in add3 at /home/exe_demo.c:5
(gdb)
  1. c运行到断点
(gdb) c
Continuing.

Breakpoint 2, add3 (a1=1, a2=2, a3=3) at /home/exe_demo.c:5
warning: Source file is more recent than executable.
5               int sum = 0;
  1. bt查看调用堆栈
(gdb) bt
#0  add3 (a1=1, a2=2, a3=3) at /home/exe_demo.c:5
#1  0x0001070a in main () at /home/exe_demo.c:34
(gdb) 
  1. f x进入x层调用栈
(gdb) f 1
#1  0x0001070a in main () at /home/exe_demo.c:34
34          result = add3(a, b, c);
  1. p 打印变量信息
(gdb) p a
$1 = 1
(gdb) p b
$2 = 2
(gdb)

6 info r 查看所有寄存器的值,以ARMv7为例

(gdb) info r
r0             0x1                 1
r1             0x2                 2
r2             0x3                 3
r3             0x0                 0
r4             0x10519             66841
r5             0xb6fd6018          3070058520
r6             0x10571             66929
r7             0xbefffb78          3204447096
r8             0x0                 0
r9             0x0                 0
r10            0x0                 0
r11            0x0                 0
r12            0xbefffc38          3204447288
sp             0xbefffb60          0xbefffb60
lr             0x1070b             67339
pc             0x1070a             0x1070a <main+56>
cpsr           0x40000030          1073741872
fpscr          0x0                 0
  1. x命令,打印内存
//x/32xw 0xbefffb60 打印内存0xbefffb60后的32个4字节,
(gdb) x/32xw 0xbefffb60 
0xbefffb60:     0xbefffb78      0xb6ffef70      0xb6ff9490      0x00000000
0xbefffb70:     0x00000000      0xb6fec471      0x00000000      0x00000009
0xbefffb80:     0x00000008      0x00000007      0x00000006      0x00000005
0xbefffb90:     0x00000004      0x00000003      0x00000002      0x00000001
0xbefffba0:     0xb6ffef70      0xb6fa11ff      0xb6fd2c44      0xbefffcf4
0xbefffbb0:     0x00000001      0x000106d3      0xb6f80769      0xb6faffb1
0xbefffbc0:     0x00000000      0x00000000      0x00010519      0xb6fd6018
0xbefffbd0:     0x00010571      0xb6ffef70      0x00000000      0x00000000
//x/32xw $sp 打印sp指针指向的内存0xbefffb60后的32个4字节
(gdb) x/32xw $sp 
0xbefffb60:     0xbefffb78      0xb6ffef70      0xb6ff9490      0x00000000
0xbefffb70:     0x00000000      0xb6fec471      0x00000000      0x00000009
0xbefffb80:     0x00000008      0x00000007      0x00000006      0x00000005
0xbefffb90:     0x00000004      0x00000003      0x00000002      0x00000001
0xbefffba0:     0xb6ffef70      0xb6fa11ff      0xb6fd2c44      0xbefffcf4
0xbefffbb0:     0x00000001      0x000106d3      0xb6f80769      0xb6faffb1
0xbefffbc0:     0x00000000      0x00000000      0x00010519      0xb6fd6018
0xbefffbd0:     0x00010571      0xb6ffef70      0x00000000      0x00000000

在GDB调试工具中,以下是x命令的不同选项和含义:

  1. x/32xw: 这个命令表示以16进制格式显示32个元素的内容,并以双字(double word)为单位进行显示。每个双字的大小通常为4个字节(32位)。这个选项对于查看内存中的数据非常有用。
  2. x/32xg: 这个命令表示以16进制格式显示32个元素的内容,并以词(word)为单位进行显示。每个词的大小通常为4个字节(32位)。这个选项可以用于查看内存中的数据。
  3. x/32xb: 这个命令表示以16进制格式显示32个元素的内容,并以字节(byte)为单位进行显示。每个字节的大小为1个字节(8位)。使用这个选项可以查看内存中的原始字节。
  4. x/32xc: 这个命令表示以字符格式显示32个元素的内容,并以每个字符(character)的形式进行显示。这个选项可以在内存中查看字符串或字符数组数据。

可以根据需要调整数量和显示格式,例如 x/8xg 将显示8个词以16进制格式,x/16xb 将显示16个字节以16进制格式。可以参考GDB的文档或手册,以了解更多选项和使用方法。

  1. ni 1命令,单步执行汇编,n步执行则将数字1改为n
(gdb) ni 1 //n步执行则将数字1改为n
0x0001063e      5               int sum = 0;   
  1. disassemble 查看反汇编
(gdb) disassemble 
Dump of assembler code for function add3:
   0x00010630 <+0>:     push    {r7}
   0x00010632 <+2>:     sub     sp, #28
   0x00010634 <+4>:     add     r7, sp, #0
   0x00010636 <+6>:     str     r0, [r7, #12]
   0x00010638 <+8>:     str     r1, [r7, #8]
   0x0001063a <+10>:    str     r2, [r7, #4]
   0x0001063c <+12>:    movs    r3, #0
=> 0x0001063e <+14>:    str     r3, [r7, #20]
   0x00010640 <+16>:    ldr     r2, [r7, #12]
   0x00010642 <+18>:    ldr     r3, [r7, #8]
   0x00010644 <+20>:    add     r3, r2
   0x00010646 <+22>:    ldr     r2, [r7, #4]
   0x00010648 <+24>:    add     r3, r2
   0x0001064a <+26>:    str     r3, [r7, #20]
   0x0001064c <+28>:    ldr     r3, [r7, #20]
   0x0001064e <+30>:    mov     r0, r3
   0x00010650 <+32>:    adds    r7, #28
   0x00010652 <+34>:    mov     sp, r7
   0x00010654 <+36>:    ldr.w   r7, [sp], #4
   0x00010658 <+40>:    bx      lr
End of assembler dump.
  1. info sharedlibrary 查看动态库的加载情况
(gdb) info sharedlibrary
From        To          Syms Read   Shared Object Library
0xb6feae60  0xb6fee348  Yes (*)     /opt/arm-XSoC-linux/arm-XSoC-linux-9.1.0/arm-XSoC-linux/sysroot/lib/ld-uClibc.so.0// 带(*)的表示这个动态库没有调试符号
0xb6f785f0  0xb6fb51e4  Yes         /opt/arm-XSoC-linux/arm-XSoC-linux-9.1.0/arm-XSoC-linux/sysroot/lib/libc.so.0
(*): Shared library is missing debugging information.

// 未加载上的动态库可能的原因:1)gdbLib目录中没有该动态库。2)有该动态库但是名字不一样,这时候需要修改下本地动态库的名字。
  1. thread apply all bt 查看所有线程的堆栈
(gdb) thread apply all bt

Thread 1 (Thread 1979.1979):
#0  0x0001063e in add3 (a1=1, a2=2, a3=3) at /home/exe_demo.c:5
#1  0x0001070a in main () at /home/exe_demo.c:34
  1. info symbol 查看地址对应的符号信息,只有代码段、全局数据段、bss段才能返回符号信息
(gdb) disassemble 
Dump of assembler code for function add3:
   0x00010630 <+0>:     push    {r7}
   0x00010632 <+2>:     sub     sp, #28
   0x00010634 <+4>:     add     r7, sp, #0
   0x00010636 <+6>:     str     r0, [r7, #12]
   0x00010638 <+8>:     str     r1, [r7, #8]
   0x0001063a <+10>:    str     r2, [r7, #4]
   0x0001063c <+12>:    movs    r3, #0
=> 0x0001063e <+14>:    str     r3, [r7, #20]
   0x00010640 <+16>:    ldr     r2, [r7, #12]
   0x00010642 <+18>:    ldr     r3, [r7, #8]
   0x00010644 <+20>:    add     r3, r2
   0x00010646 <+22>:    ldr     r2, [r7, #4]
   0x00010648 <+24>:    add     r3, r2
   0x0001064a <+26>:    str     r3, [r7, #20]
   0x0001064c <+28>:    ldr     r3, [r7, #20]
   0x0001064e <+30>:    mov     r0, r3
   0x00010650 <+32>:    adds    r7, #28
   0x00010652 <+34>:    mov     sp, r7
   0x00010654 <+36>:    ldr.w   r7, [sp], #4
   0x00010658 <+40>:    bx      lr
End of assembler dump.
(gdb) info symbol  0x00010648
add3 + 24 in section .text of /home/355308/test/blueOceanProject/03/build/03StackAnaly
(gdb)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【动态规划 状态机dp】3082. 求出所有子序列的能量和

算法可以发掘本质&#xff0c;如&#xff1a; 一&#xff0c;若干师傅和徒弟互有好感&#xff0c;有好感的师徒可以结对学习。师傅和徒弟都只能参加一个对子。如何让对子最多。 二&#xff0c;有无限多1X2和2X1的骨牌&#xff0c;某个棋盘若干格子坏了&#xff0c;如何在没有坏…

idea连接Docker数据库

我们在docker下创建了数据库&#xff0c;想要更方便的查看和操作该数据库&#xff0c;idea和DataGrip或者其他人家都可以。在数据库连接时需要填写数据库名字&#xff0c;主机&#xff0c;端口&#xff0c;数据库用户名和密码。 输入之后先不要点击OK和按Enter键&#xff0c;我…

vue+springboot实验个人信息,修改密码,忘记密码功能实现

前端部分 新增Person&#xff08;个人页面&#xff09;&#xff0c;Password&#xff08;修改密码页面&#xff09;&#xff0c;还需要对Manager&#xff0c;login页面进行修改 router文件夹下的index.js&#xff1a; import Vue from vue import VueRouter from vue-router i…

【运输层】TCP 的流量控制和拥塞控制

目录 1、流量控制 2、TCP 的拥塞控制 &#xff08;1&#xff09;拥塞控制的原理 &#xff08;2&#xff09;拥塞控制的具体方法 1、流量控制 一般说来&#xff0c;我们总是希望数据传输得更快一些。但如果发送方把数据发送得过快&#xff0c;接收方就可能来不及接收&#x…

Ubuntu20.04无法连接蓝牙

连接蓝牙的时候一直转圈显示搜索中&#xff0c;但是搜索不出来任何设备。 在终端输入 dmesg | grep -i blue 可看到有以下信息 可以看到无法识别蓝牙&#xff0c;处于一个unknow的状态 Bluetooth: hci0: RTL: unknown IC info, lmp subver 8852, hci rev 000b, hci ver 000b…

云轴科技ZStack入选中国信通院《高质量数字化转型产品及服务全景图(2023年度)》

近日&#xff0c;由中国互联网协会主办、中国信通院承办的“2024高质量数字化转型创新发展大会”暨“铸基计划”年度会议在北京成功召开。 本次大会发布了2024年度行业数字化转型趋势&#xff0c;总结并展望了“铸基计划”2023年取得的工作成果及2024年的工作规划。同时&#…

支付宝支付之SpringBoot整合支付宝创建自定义支付二维码

文章目录 自定义支付二维码pom.xmlapplication.yml自定义二维码类AlipayService.javaAlipayServiceImpl.javaAlipayController.javaqrCode.html 自定义支付二维码 继&#xff1a;SpringBoot支付入门 pom.xml <dependency><groupId>org.springframework.boot<…

大语言模型微调技术

Adapter 参考资料&#xff1a;《Parameter-efficient transfer learning for nlp》 adpater首先将原始的d维特征映射到较小的维度m&#xff0c;应用非线性函数&#xff0c;然后再重新映射回d维。总的参数量&#xff08;包含biases&#xff09;为 2mddm&#xff0c; 当m远小于d…

算法打卡day38

今日任务&#xff1a; 1&#xff09;完全背包理论基础(卡码网52. 携带研究材料) 2&#xff09;518.零钱兑换II 3&#xff09;377. 组合总和 Ⅳ 4&#xff09;复习day13 完全背包理论基础(卡码网52. 携带研究材料) 题目链接&#xff1a;52. 携带研究材料&#xff08;第七期模拟…

以大学生活为主题的演讲稿(3篇)

以大学生活为主题的演讲稿&#xff08;3篇&#xff09; 以下是三篇以大学生活为主题的演讲稿范文&#xff0c;供您参考&#xff1a; 演讲稿一&#xff1a;拥抱大学生活&#xff0c;绽放青春梦想 尊敬的老师、亲爱的同学们&#xff1a; 大家好&#xff01; 今天&#xff0c;我…

VLAN知识点总结

首先对交换机等设备进行了解 中继器&#xff1a;物理层设备 只能提供电流信息的电压恢复&#xff0c;但无法恢复波形&#xff0c;所以无法理论无限延长传输距离 集线器&#xff1a;物理层设备 多接口的中继器 二层交换机的作用&#xff1a; 区别集线器&#xff08;HUB&#…

【问题处理】银河麒麟操作系统实例分享,服务器操作系统VNC远程问题分析

1.服务器环境以及配置 【内核版本】 4.19.90-23.8.v2101.ky10.aarch64 【OS镜像版本】 0518-server 2.问题现象描述 服务器通过vncserver:1.service服务启动的vnc服务后&#xff0c;普通用户用vnc连接时&#xff0c;锁屏后&#xff0c;然后输入登陆密码会报密码错误&…

五款3dmax常用插件推荐(含云渲染工具)

在三维建模和动画设计领域&#xff0c;3ds Max软件因其强大功能和灵活性而广受欢迎。为了进一步提升工作效率和创作质量&#xff0c;有许多插件可供选择。本文推荐五款常用3ds Max插件&#xff0c;帮助你更好实现复杂的模型和动效创作。 五款3dmax常用插件推荐 1、Kitchen Cab…

RocketMQ并发消息消费重试DEMO

无序消息的重试只针对集群消费模式生效&#xff1b;广播消费模式不提供失败重试特性 Producer 发了100个对象消息 public class AddProducer {public static void main(String[] args) throws Exception {DefaultMQProducer producer new DefaultMQProducer("a-group&q…

计算机视觉入门:探索机器如何“看见”世界

计算机视觉是人工智能领域的一个令人兴奋的分支&#xff0c;它使计算机能够从图像和视频中“看见”和理解世界。这项技术已经渗透到我们生活的方方面面&#xff0c;从智能手机的面部识别到自动驾驶汽车的导航系统。但是&#xff0c;计算机视觉是如何工作的呢&#xff1f;让我们…

U盘管理软件 设置U盘权限的软件

U盘管理软件 设置U盘权限的软件 我们都知道U盘的功能很强大&#xff0c;携带也很方便&#xff0c;但是它的危险指数也是相当高的&#xff0c;既容易携带病毒&#xff0c;又可以拷贝公司里的保密文件。所以很多企业都很关注对U盘使用的管理&#xff0c;而方法&#xff0c;最好的…

PLSQL的下载与安装

个人介绍 hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的…

色彩的魔力:渐变色在设计中的无限可能性

夕阳&#xff0c;天空&#xff0c;湖面&#xff0c;夕阳...随着距离和光影的变化&#xff0c;颜色的渐变色&#xff0c;近大远小、近实远虚的透视&#xff0c;为大自然营造了浪漫的氛围。延伸到UI/UX设计领域&#xff0c;这种现实、惊艳、独特的渐变色也深受众多设计师的喜爱。…

JavaEE初阶Day 13:多线程(11)

目录 Day 13&#xff1a;多线程&#xff08;11&#xff09;常见的锁策略1. 悲观锁 vs 乐观锁2. 重量级锁 vs 轻量级锁3. 自旋锁 vs 挂起等待锁4. 可重入锁 vs 不可重入锁5. 公平锁 vs 非公平锁6. 互斥锁 vs 读写锁 synchronized实现原理1. 锁升级2. 锁消除3. 锁粗化 CAS Day 13…

“捡到一束光,日落时还给太阳”

数据结构初阶题解 1.移除元素2.合并两个有序数组3.移除链表元素4.反转链表5.合并两个有序链表6.链表的中间结点7.环形链表的约瑟夫问题8.分割链表有感&#xff1a;其实我早就死了&#xff0c;死在破碎的三观里&#xff1b;死在飘渺的理想里&#xff1b;死在幻想的感情里&#x…
最新文章