【调试手段】GDB调试
文章目录
- 调试示例
- 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调试相关推荐
- java 调试 gdb_android gdb 调试实例演示(有源代码篇)
android ndk代码的调试本身还是有点麻烦的,因为本身google android的sdk 主要是面向广大的java程序员的,所以后来发布的 ADT 集成开发环境对java的代码调试 支持还是很 ...
- linux子系统gdp调试,Linux GDB调试 详述
今天来分享下gdb的简单调试,我这里写了个例子 三个.c文件 func1.c func2.c main.c 首先生成可调试的执行文件 gcc -g func1.c func2.c main.c -o ...
- 【FFMPEG系列】之ffmpeg怎么利用gdb调试以及gdb调试快捷键
1.编译可调试的FFmepg (1).使用命令: ./configure --enable-debug --disable-optimizations --disable-asm --disable- ...
- 【C++之GDB调试】GDB调试从入门到精通
GDB作为经典的调试系统,这里记录它的原理和实践. GDB概述 GDB是什么 GDB是GNU开源组织发布的一个强大的UNIX/Linux下的程序调试工具,支持多种语言. 编译程序 "-g&q ...
- GDB调试器——GDB调试器简介
以下内容源于C语言中文网的学习与整理,如有侵权,请告知删除. 一.程序调试器的含义 程序中的错误主要分为 2 类,分别为语法错误和逻辑错误. 程序中出现的语法错误可以借助编译器解决:但逻辑错误则只能靠 ...
- 秃鹫入门4,GDB调试与OpenCV图像库
目录 前言 一.GDB调试 GDB相关 GDB调试实例 二.OpenCV图像编程 OpenCV安装 1.图片特效 2.处理视频 总结 前言 这次要接触的是程序猿不可不懂GDB先生 和著名图像处理软件o ...
- 室友打了一晚上游戏我学会了使用GDB调试
gdb调试 GDB的重要性 启动gdb 查看程序的源码 gdb启动程序 设置断点 删除断点或者或者禁用断点 单步调式 查看这个变量的值 gdb 调试core文件 使用gdb调试正在运行的程序 gdb ...
- postgresql源码学习(一)—— 源码编译安装与gdb调试入门
一. postgresql源码编译安装 因为只是用来调试的测试环境,把基本的软件装好和库建好就可以,一切从简. 1. 创建用户和目录 mkdir -p /data/postgres/base/ mkd ...
- linux_进程类相关学习-fork函数-getpid函数-getppid函数-getuid函数-geteuid函数-getgid函数-getegid函数-进程之间共享数据-进程gdb调试
接上一篇:linux_环境变量-C语言代码打印环境变量-getenv函数-setenv函数-unsetenv函数 本次来分享进程类相关的学习,主要就是分享一些函数的使用,来,开始上菜: 目录 1.fo ...
- 【GDB调试-5】远程调试
文章目录 一.gdbserver 1.1 安装gdbserver 1.2 配置防火墙 二.gdbserver的启动与连接 2.1 gdbserver启动 2.2 gdb连接 三.gdb远程调试stm3 ...
最新文章
- 中国行政区划信息JS库china-location
- 粒子物理学有了新的基础数学理论
- 从零开始_学_数据结构(六)——排序(冒泡、插入、希尔、简单选择、归并、快速)...
- # 2017-2018-1 20155224 《信息安全系系统设计基础》实验四
- ExtJs之Field.Trigger和Field.Spinner
- boost::mpl模块实现pop_front相关的测试程序
- Scala _07trait特性
- 继裁员15%后 滴滴宣布本月25日开始减少员工福利
- [原]CentOS 6.5 上安装 MySQL 5.6
- Android源码编译Android Studio(带jar和jni)工程
- mongo 的逻辑存储和物理存储
- java获取中文拼音,java实现根据汉字获取拼音
- 台达PLC变频器通讯程序
- 开放式经济系统设计[转载]
- Codeforces1153D-Serval and Rooted Tree(树形dp)
- tp5子域名index.php,tp5实现绑定子域名,并且根据子域名定义路由规则
- 【真相】ChatGPT和OpenAI的API KEY
- Windows下错误码全解析
- 表格布局管理器TableLayout
- War Room - 战争房间
热门文章
- java随机生成车牌_JDBC:随机生成车牌号,批量插入数据库
- KubeSphere
- BootStrap中的日期时间组件datetimepicker
- 使用Maven插件对项目进行打包
- 删除对象键值_JavaScript的解构技巧:排除对象属性、避免命名冲突、交换……...
- 京东宙斯php版本sdk不能用_多主机平台玩家的福音,北通宙斯T6精英版体验测评...
- java计算两个时间段的重合天数
- 安装windows和android双系统,安装Windows和Android双系统.doc
- eclipse 选取当前行_苏云金杆菌的防虫效果,取决于能否科学利用,绝非一句“用就行”...
- object怎么转list_PaddleOCR识别模型转Pytorch全流程记录