文章目录

  • 调试示例
  • 1、调试流程
    • 1.1 C-style
    • 1.2 汇编style
  • 2、GDB Layout的使用
  • 3、查询运行信息
  • 4、设置断点
  • 5、输出格式
  • 6、查看寄存器
  • 7、查看内存
  • 8、以自动换行的方式打印结构体变量
  • 9、设置环境变量
调试示例
gdb ./demo
(gdb) set args 11 22  ;demo执行时命令参数为 ./demo 11 22
(gdb) start
(gdb) b 1201
(gdb) info b
(gdb) c
(gdb) step
(gdb) finish
(gdb) layout src
(gdb) list
(gdb) print a
(gdb) print $r0
(gdb) q
1、调试流程
1.1 C-style

(gdb) r(un)
(gdb) n(ext)
(gdb) s(tep)
(gdb) c(ontinue)

1.2 汇编style

(gdb) n(ext)i
(gdb) s(tep)i

2、GDB Layout的使用
Command 作用
display /i $pc 命令可以在调试时显示每条汇编命令。
info win 显示窗口的大小
layout next 切换到下一个布局模式
layout prev 切换到上一个布局模式
layout src 只显示源代码
layout asm 只显示汇编代码
layout split 显示源代码和汇编代码
layout regs 增加寄存器内容显示
focus cmd/src/asm/regs/next/prev 切换当前窗口
refresh 刷新所有窗口
dir srcDir 设置源码的搜索目录,srcDir指源码目录
tui reg next 显示下一组寄存器
tui reg system 显示系统寄存器
update 更新源代码窗口和当前执行点
winheight name +/- line 调整name窗口的高度
tabset nchar 设置tab为nchar个字符
Ctrl + L 刷新窗口
Ctrl + x 再按1:单窗口模式,显示一个窗口
Ctrl + x 再按2:双窗口模式,显示两个窗口
Ctrl + x 再按a:回到传统模式,即退出layout,回到执行layout之前的调试窗口。
Ctrl + n / Ctrl + p layout 之后,可以通过其获取前一条执行命令或后一条执行命令
3、查询运行信息
Command 作用
where/bt 当前运行的堆栈列表
bt backtrace 显示当前调用堆栈
up/down 改变堆栈显示的深度
set args 参数 指定运行时的参数
show args 查看设置好的参数
info program 来查看程序的是否在运行,进程号,被暂停的原因。
4、设置断点
Command 作用
break < function > 在进入指定函数时停住。C++中可以使用class::function或function(type,type)格式来指定函数名。
break 在指定行号停住。
break +offset / break -offset 在当前行号的前面或后面的offset行停住。offiset为自然数。
break filename:linenum 在源文件filename的linenum行处停住。
break filename:function 在源文件filename的function函数的入口处停住。
break *address 在程序运行的内存地址处停住。
break break命令没有参数时,表示在下一条指令处停住。
break … if < condition > …可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环体中,可以设置break if i==100,表示当i为100时停住程序。
delete [breakpoints][range] 删除指定的断点,breakpoints为断点号,range表示断点号的范围

查看断点时,可使用info命令,如下所示:(注:n表示断点号)
info breakpoints [n]
info break [n]

5、输出格式

一般来说,GDB会根据变量的类型输出变量的值。但你也可以自定义GDB的输出的格式。例如,你想输出一个整数的十六进制,或是二进制来查看这个整型变量的中的位的情况。要做到这样,你可以使用GDB的数据显示格式:

x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。

(gdb) p i
$21 = 101
(gdb) p/a i
$22 = 0x65
(gdb) p/c i
$23 = 101 'e'
(gdb) p/f i
$24 = 1.41531145e-43
(gdb) p/x i
$25 = 0x65
(gdb) p/t i
$26 = 1100101

参考网址:https://wiki.ubuntu.org.cn/%E7%94%A8GDB%E8%B0%83%E8%AF%95%E7%A8%8B%E5%BA%8F

6、查看寄存器

(gdb) i r
(gdb) i r a # 查看所有寄存器(包括浮点、多媒体)
(gdb) i r esp
(gdb) i r pc
查看所有的寄存器(Like NEON Q… on ARM): info all-registers
参考网址:https://stackoverflow.com/questions/5429137/how-to-print-register-values-in-gdb

以十进制的方式查看寄存器的值: p/d $pc 参考网址:https://ftp.gnu.org/old-gnu/Manuals/gdb-5.1.1/html_node/gdb_54.html

7、查看内存

你可以使用examine命令(简写是x)来查看内存地址中的值。x命令的语法如下所示:

x/<n/f/u> <addr>
  • n、f、u是可选的参数。
  • n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
  • f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地址是指令地址,那么格式可以是i。
  • u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。当我们指定了字节长度后,GDB会从指定的内存地址开始,读写指定字节,并把其当作一个值取出来。

< addr >表示一个内存地址。
n/f/u三个参数可以一起使用。例如:
命令:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十进制显示。

8、以自动换行的方式打印结构体变量
以自动换行的方式打印结构体变量: set print pretty

参考网址:https://www.cnblogs.com/ims-/p/10529393.html

9、设置环境变量
PATH=$PATH:userpath

参考网址:http://www.yolinux.com/TUTORIALS/GDB-Commands.html
参考网址:http://www.akira.ruc.dk/~keld/teaching/CAN_e14/Readings/gdb.pdf
参考网址:https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/gdb.html
参考网址:https://www.cnblogs.com/arnoldlu/p/9633254.html

【调试手段】GDB调试相关推荐

  1. java 调试 gdb_android gdb 调试实例演示(有源代码篇)

    android ndk代码的调试本身还是有点麻烦的,因为本身google android的sdk 主要是面向广大的java程序员的,所以后来发布的 ADT 集成开发环境对java的代码调试 支持还是很 ...

  2. linux子系统gdp调试,Linux GDB调试 详述

    今天来分享下gdb的简单调试,我这里写了个例子 三个.c文件 func1.c func2.c main.c 首先生成可调试的执行文件 gcc -g func1.c func2.c main.c -o ...

  3. 【FFMPEG系列】之ffmpeg怎么利用gdb调试以及gdb调试快捷键

    1.编译可调试的FFmepg (1).使用命令: ./configure --enable-debug --disable-optimizations --disable-asm --disable- ...

  4. 【C++之GDB调试】GDB调试从入门到精通

    GDB作为经典的调试系统,这里记录它的原理和实践. GDB概述 GDB是什么 GDB是GNU开源组织发布的一个强大的UNIX/Linux下的程序调试工具,支持多种语言. 编译程序 "-g&q ...

  5. GDB调试器——GDB调试器简介

    以下内容源于C语言中文网的学习与整理,如有侵权,请告知删除. 一.程序调试器的含义 程序中的错误主要分为 2 类,分别为语法错误和逻辑错误. 程序中出现的语法错误可以借助编译器解决:但逻辑错误则只能靠 ...

  6. 秃鹫入门4,GDB调试与OpenCV图像库

    目录 前言 一.GDB调试 GDB相关 GDB调试实例 二.OpenCV图像编程 OpenCV安装 1.图片特效 2.处理视频 总结 前言 这次要接触的是程序猿不可不懂GDB先生 和著名图像处理软件o ...

  7. 室友打了一晚上游戏我学会了使用GDB调试

    gdb调试 GDB的重要性 启动gdb 查看程序的源码 gdb启动程序 设置断点 删除断点或者或者禁用断点 单步调式 查看这个变量的值 gdb 调试core文件 使用gdb调试正在运行的程序 gdb ...

  8. postgresql源码学习(一)—— 源码编译安装与gdb调试入门

    一. postgresql源码编译安装 因为只是用来调试的测试环境,把基本的软件装好和库建好就可以,一切从简. 1. 创建用户和目录 mkdir -p /data/postgres/base/ mkd ...

  9. linux_进程类相关学习-fork函数-getpid函数-getppid函数-getuid函数-geteuid函数-getgid函数-getegid函数-进程之间共享数据-进程gdb调试

    接上一篇:linux_环境变量-C语言代码打印环境变量-getenv函数-setenv函数-unsetenv函数 本次来分享进程类相关的学习,主要就是分享一些函数的使用,来,开始上菜: 目录 1.fo ...

  10. 【GDB调试-5】远程调试

    文章目录 一.gdbserver 1.1 安装gdbserver 1.2 配置防火墙 二.gdbserver的启动与连接 2.1 gdbserver启动 2.2 gdb连接 三.gdb远程调试stm3 ...

最新文章

  1. 中国行政区划信息JS库china-location
  2. 粒子物理学有了新的基础数学理论
  3. 从零开始_学_数据结构(六)——排序(冒泡、插入、希尔、简单选择、归并、快速)...
  4. # 2017-2018-1 20155224 《信息安全系系统设计基础》实验四
  5. ExtJs之Field.Trigger和Field.Spinner
  6. boost::mpl模块实现pop_front相关的测试程序
  7. Scala _07trait特性
  8. 继裁员15%后 滴滴宣布本月25日开始减少员工福利
  9. [原]CentOS 6.5 上安装 MySQL 5.6
  10. Android源码编译Android Studio(带jar和jni)工程
  11. mongo 的逻辑存储和物理存储
  12. java获取中文拼音,java实现根据汉字获取拼音
  13. 台达PLC变频器通讯程序
  14. 开放式经济系统设计[转载]
  15. Codeforces1153D-Serval and Rooted Tree(树形dp)
  16. tp5子域名index.php,tp5实现绑定子域名,并且根据子域名定义路由规则
  17. 【真相】ChatGPT和OpenAI的API KEY
  18. Windows下错误码全解析
  19. 表格布局管理器TableLayout
  20. War Room - 战争房间

热门文章

  1. java随机生成车牌_JDBC:随机生成车牌号,批量插入数据库
  2. KubeSphere
  3. BootStrap中的日期时间组件datetimepicker
  4. 使用Maven插件对项目进行打包
  5. 删除对象键值_JavaScript的解构技巧:排除对象属性、避免命名冲突、交换……...
  6. 京东宙斯php版本sdk不能用_多主机平台玩家的福音,北通宙斯T6精英版体验测评...
  7. java计算两个时间段的重合天数
  8. 安装windows和android双系统,安装Windows和Android双系统.doc
  9. eclipse 选取当前行_苏云金杆菌的防虫效果,取决于能否科学利用,绝非一句“用就行”...
  10. object怎么转list_PaddleOCR识别模型转Pytorch全流程记录