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, #280x00010634 <+4>:     add     r7, sp, #00x00010636 <+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, r20x00010646 <+22>:    ldr     r2, [r7, #4]0x00010648 <+24>:    add     r3, r20x0001064a <+26>:    str     r3, [r7, #20]0x0001064c <+28>:    ldr     r3, [r7, #20]0x0001064e <+30>:    mov     r0, r30x00010650 <+32>:    adds    r7, #280x00010652 <+34>:    mov     sp, r70x00010654 <+36>:    ldr.w   r7, [sp], #40x00010658 <+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 btThread 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, #280x00010634 <+4>:     add     r7, sp, #00x00010636 <+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, r20x00010646 <+22>:    ldr     r2, [r7, #4]0x00010648 <+24>:    add     r3, r20x0001064a <+26>:    str     r3, [r7, #20]0x0001064c <+28>:    ldr     r3, [r7, #20]0x0001064e <+30>:    mov     r0, r30x00010650 <+32>:    adds    r7, #280x00010652 <+34>:    mov     sp, r70x00010654 <+36>:    ldr.w   r7, [sp], #40x00010658 <+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.mzph.cn/pingmian/98.shtml

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

相关文章

制作直通网线和交叉网线

制作直通网线和交叉网线 1. 网络直通线2. 网络交叉线References 双绞线的连接方法有两种&#xff1a;直通连接和交叉连接 。 直通连接是将双绞线的两端分别都依次按白橙、橙、白绿、蓝、白蓝、绿、白棕、棕色的顺序 (国际 EIA/TIA 568B 标准) 压入 RJ45 水晶头内。这种方法制作…

壁纸、软件、电子书、音乐资源、数据库资源,囤一囤

资源网站我真的有很多&#xff01;&#xff01;下面这十几个都是壁纸资源、软件资源、电子书资源、音乐资源、数据库资源等等&#xff0c;感兴趣的囤一囤&#xff01; 一、壁纸资源 1、PEXELS 网址&#xff1a; https://www.pexels.com/zh-cn/ 一个专门分享无版权图片的网站…

Windows突然蓝屏解决办法

Windows突然蓝屏&#xff0c;然后重复开机没有用&#xff0c;但是能进入bios系统&#xff0c;证明内存和磁盘没事&#xff0c;用大白菜制作了PE系统盘制作过程&#xff08;之前一直都是用官方镜像制作&#xff0c;但是发现用大白菜制作可以对系统之前的磁盘里面重要的信息拷贝到…

Python 日期格式化,等日期相关操作

输入日期格式字符串 获取时间戳 构造时间&#xff0c;时间加减等 import time import datetimedef format_time() -> None:""" 日期格式化"""inputStr1: str input("输入一个时间格式的字符串")timeArray time.strptime(inputSt…

Python用于比较数据结构并生成差异报告的工具库之data-diff使用详解

概要 Python的data-diff库是一个用于比较数据结构并生成差异报告的工具。它可以处理各种数据类型,如字典、列表、集合等,使得开发者能够快速识别数据之间的差异。 安装 通过pip可以轻松安装data-diff: pip install data-diff特性 支持多种数据类型:能够比较字典、列表、…

tokio 学习

Rust Async 异步编程 简易教程 理解tokio核心(1): runtime Rust 中的异步编程 Rust 中的 async 和线程 OS 线程&#xff1a; 适用于少量任务&#xff0c;有内存和 CPU 开销&#xff0c;且线程生成和线程间切换非常昂贵线程池可以降低一些成本允许重用同步代码&#xff0c;…

【Python-第三方库】cv2

作用 一个开源的库平台计算机视觉库。 安装 pip install opencv_python导入 import cv2 as cv函数 cv.imread( ) 用于读取图片文件 image cv.imread(image_path)image_path&#xff1a; 图片路径。 未待完续…

新手做抖音小店,最易爆单的几大类目分享,抓紧收藏!

大家好&#xff0c;我是电商糖果 新手做抖店没有经验&#xff0c;不了解市场&#xff0c;很多人都担心类目选错了&#xff0c;很难起店。 毕竟电商行业有一句话&#xff0c;类目大于一切&#xff0c;选择大于努力。 类目没有选对&#xff0c;再折腾也没用。 糖果做抖音小店…

eclipse配置SVN和Maven插件

3、 安装SVN插件 使用如下方法安装 Help–Install New Software 注意&#xff1a;目前只能安装1.8.x这个版本的SVN&#xff0c;如果使用高版本的SVN&#xff0c;在安装SVN和maven整合插件的时候就会报错&#xff0c;这应该是插件的bug。 点击Add name: subclipse location…

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

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

Linux gcc 6

本章开始学习工具 什么是工具&#xff1f; 本质也是指令 yum 命令 小火车 sudo yum install sl&#xff08;安装sl&#xff09; sudo yum install -y sl //直接yes就不提示了 yum list //将yum源上的软件都穷举出来 yum search sl //结果不友好&#xff0c;不推荐 yum lis…

活动报名 | 如何进行全增量一体的异构数据库实时同步

伴随着新技术的不断涌现&#xff0c;市场竞争也在不断开辟新的角斗场——新的业务需求&#xff0c;新的应用设想都在这里迸发。 面对如此日新月异的竞争环境&#xff0c;企业的当务之急&#xff0c;是为新应用扎根准备好随时可取、准确一致的高质量数据土壤。在这样的背景下&a…

(二十八)Flask之wtforms库【上手使用篇】

目录&#xff1a; 每篇前言&#xff1a;用户登录验证&#xff1a;用户注册验证&#xff1a;使用示例&#xff1a; 抽象解读使用wtforms编写的类&#xff1a;简单谈一嘴&#xff1a;开始抽象&#xff1a; 每篇前言&#xff1a; &#x1f3c6;&#x1f3c6;作者介绍&#xff1a;【…

Docker 磁盘占用过多问题处理过程记录

一、问题描述 突然发现服务器磁盘使用超过95%了&#xff08;截图时2.1 和 2.2 已经执行过了&#xff09; 二、问题分析与解决 2.1&#xff0c;docker 无用镜像占用磁盘 # 使用 docker images 查看服务的镜像 docker images# 可以手动删除一些很大不用的 docker rmi ***## 也…

一秒内传输50万对纠缠光子?!纽约市量子网络刷新纪录

量子网络技术行业的领军企业Qunnect宣布&#xff0c;在纽约市的GothamQ网络上&#xff0c;其偏振量子比特的传输性能刷新了纪录。Qunnect利用现有的商用光缆实现了每秒传输50万对高保真度纠缠光子的速率&#xff0c;且该网络的正常运行时间超过了99%。 纽约34公里长的GothamQ量…

服务器数据恢复—RAID5故障导致SAP+oracle数据丢失的数据恢复案例

服务器存储数据恢复环境&#xff1a; 某品牌服务器存储中有一组由6块SAS硬盘组建的RAID5阵列&#xff0c;其中有1块硬盘作为热备盘使用。上层划分若干lun&#xff0c;存放Oracle数据库数据。 服务器存储故障&分析&#xff1a; 该RAID5阵列中一块硬盘出现故障离线&#xff0…

PAT——1009说反话(C++)

问题描述&#xff1a; 给定一句英语&#xff0c;要求你编写程序&#xff0c;将句中所有单词的顺序颠倒输出。 输入格式&#xff1a; 测试输入包含一个测试用例&#xff0c;在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成&#xff0c;其中单词是由英文字…

开启Three.js之旅(会持续完善)

文章目录 Three.js必备构建项目场景Scene相机CameraPerspectiveCamera 渲染器WebGLRendererCSS3DRenderer 灯光LightAmbientLightDirectionalLight 平行光PointLight 加载器CacheFileLoaderLoaderGLTFLoaderRGBELoaderTextureLoader 材质MetarialMeshBasicMaterialMeshLambertM…

k8s集群资源编排清单文件解读

1、YAML 文件概述 k8s集群中对资源管理和资源对象编排部署都可以通过声明样式&#xff08;YAML&#xff09;文件来解决&#xff0c;也就是可以把需要对资源对象操作编辑到 YAML 格式文件中&#xff0c;我们把这种文件叫做资源清单文件&#xff0c;通过 kubectl 命令直接使用资源…

原子的内部结构

原子非常神奇&#xff0c;花时间思考它是非常有价值的。尽管传统的太阳系示意图存在致命的缺点&#xff0c;但我们还是可以局部应用于原子。 首先&#xff0c;原子与太阳系具有相似性一原子的中心质量大&#xff0c;外部质量小。我们用最简单的氢原子做分析&#xff0c;氢原子…