GDB调试基础使用方法
尽管目前使用的VS code可以使用插件一键构建和运行程序,但GDB作为调试利器,还是值得花时间去学习的。
概述
GDB(GNU Debugger) 是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。
参考: gdb调试利器
进入GDB环境调试
加载编译选项” –g”
以便在GDB调试环境中能够显示出具体的错误位置。
例:
g++ filename.cpp –g –o filename
在cmake编译中,可以通过可选项 -DCMAKE_VERBOSE_MAKEFILE=1 ,具体显示编译过程,保证-g选项在编译过程中使用。
加载可执行文件到GDB中
在执行文件所在文件夹里,使用 gdb 命令进入到GDB调试环境中。之后使用 file filename
或者使用 gdb filename (filename可执行文件名)。
对执行文件进行输入参数的设置
使用命令 set args parameter (parameter为输入的参数),加载运行所需的参数。通过 show args 查看加载参数的情况。
例:
set args /home/hello.png 2016 12
使用’show args’后:
/home/hello.png 2016 12
GDB内使用make
外部文件有修改的情况下,直接在GDB环境中使用“make”进行编译。
文件执行
使用 r 即可对文件进行执行。
退出GDB调试环境
使用 q 退出调试环境。
断点设置
断点设置的方法
- 使用行号:
b linenumber例:“b 2017” - 使用函数名
b function例:“b hello” - 使用地址
b *address例:“b *0x404”
若在不同文件上打断点,在行号或函数名前加上文件名和冒号“filename:”。
例:
b hello.cpp:hello
b hello.cpp:2017
条件断点
在1小点方法后面加入条件,断点在条件成立时起停止作用。
例:
b 12 if x > y // 在x > y情况下,断点起作用。
断点条件更改
将指定断点号的条件进行修改:
condition breakpointnumber expression
例:
condition 12 if x = y
condition breakpointnumber停止使用条件,断点不受条件限制使用。
例:
condition 12
断点信息查看
- 查看所有的断点信息:
info b - 查看指定断点号断点信息:
info b number
断点的使能
- 停止该号断点。但未删除:
dis breakpointnumber - 使能改号断点:
enable breakpointnumber
调试的方式
打印变量 p
- 打印变量值:
p variable例: “p x” - 打印变量地址:
p &variable例: “p &x” - 打印指针内容:
p *point例: “p *pData”
单步调试 s
类似于 step in
- 单步执行,遇到函数,进入到函数内部执行。
s number进行多步执行
单步执行 n
类似 step over 执行,遇到函数,不进入函数内部,直接执行完函数。
n number 进行多步执行
继续执行 c
在程序在执行中遇到断点后,使用 c 继续执行
执行完当前函数并打印出信息 finish
在函数内部使用 finish ,执行完当前整个函数打印返回信息
设置变量值调试
set var variable = x 将变量设置为x后进行调试
例:
set var tmp = 5
将变量 tmp 设置为5,var关键词确保不产生冲突
段错误的查找
段回溯 bt
- 在出现 segment fault 时,使用命令进行段错误的查看。
- 可以得到错误坐在的函数。像得到某人家庭地址。
- 也可使用
where
进入错误段
- 在查看到错误的位置之后,使用
frame number进入到该段内部。 - 进入内部之后便可以进行局部变量的打印调试。
例:
frame 5
就进入到段5.
- 切换到上一层段:
up - 切换到下一层段:
down
代码显示
- 显示当前代码:
l - 显示当前之前的代码:
l - - 显示该行周围代码:
l number - 显示该函数周围代码:
l function(C++代码需要在函数名前加类名,重载函数需要在函数内加参数类型) - 显示指定文件指定行周围代码:
l filename:linenumber
例:
l hello.cpp:1 // 从hello.cpp第一行开始显示
- 显示指定文件指定函数周围代码:
l filename:function
例:
l hello.cpp:Util::hello // 显示hello.cpp文件下,Util类的函数hello
- 显示起始终止行内代码:
l fisrt,last
例:
l 1,30 // 从第0行显示到第30行的内容
关于GDB调试的相关文章:https://www.cnblogs.com/acceptedzhs/p/13161213.html
GDB调试基础使用方法的更多相关文章
- GDB调试基础
GDB调试基础 https://lesca.me/archives/gdb-basic-knowledge.html GDB笔记(二):条件断点.命令列表.监视点 https://lesca.me/a ...
- [转]GDB调试基础
一.gdb常用命令: 命令 描述 backtrace(或bt) 查看各级函数调用及参数 finish 连续运行到当前函数返回为止,然后停下来等待命令 frame(或f) 帧编号 选择栈帧 info(或 ...
- gdb调试原理及qemu中的gdbserver
(一)gdb调试原理 此部分转自:https://blog.csdn.net/u012658346/article/details/51159971 https://www.cnblogs.c ...
- 嵌入式 GDB调试死锁示例
死锁:一种情形,此时执行程序中两个或多个线程发生永久堵塞(等待),每个线程都在等待被 其他线程占用并堵塞了的资源.例如,如果线程A锁住了记录1并等待记录2,而线程B锁住了记录2并等待记录1,这样两个线 ...
- gdb调试段错误及使用
在编程调试中,经常出现段错误,此时可用gdb调试.具体方法为注册段错误信号处理函数,在处理函数中启动gdb.具体代码如下: void segv_handler(int no) { ]; ]; FILE ...
- Linux基础 30分钟GDB调试快速突破
引言 Linus心灵鸡汤 在*nix开发中有道卡叫gdb调试,不管你怎么搞. 它依然在那丝毫不会松动.今天致敬一个 活着的传奇 Linus Torvalds Unix 始于上个世纪60年代,在70年代 ...
- CodeBlocks(17.12) 代码调试基础方法&快捷方式
转载:CodeBlocks(17.12) 代码调试基础方法&快捷方式: https://www.cnblogs.com/DCD112358/p/8998053.html
- 调试器GDB的基本使用方法
GDB调试的三种方式: 1. 目标板直接使用GDB进行调试. 2. 目标板使用gdbserver,主机使用xxx-linux-gdb作为客户端. 3. 目标板使用ulimit -c unlimited ...
- 《gdb调试之基础篇》
<gdb调试之基础篇> http://blog.csdn.net/miss_acha/article/details/42346543
随机推荐
- centos7安装YouCompleteMe,vim打造成C++的IDE
一.安装python3 1.安装编译工具 yum -y groupinstall "Development tools" yum -y install zlib-devel bzi ...
- Blend学习之Loading加载动画
介绍: Blend for visual studio 与 visual studio 是有区别的 两者虽然是IDEA 但是专注的方向是不同的,前者是专注UI后者专注业务逻辑,当然你要用blend f ...
- Java知识系统回顾整理01基础06数组01创建数组
一.数组定义 定义:数组是一个固定长度的,包含了相同类型数据的 容器 二.声明数组 int[] a; 声明了一个数组变量. []表示该变量是一个数组 int 表示数组里的每一个元素都是一个整数 a 是 ...
- c语言 static的用法
static在c里面可以用来修饰变量,也可以用来修饰函数.先看用来修饰变量的时候.变量在c里面可分为存在全局数据区.栈和堆里.其实我们平时所说的堆栈是栈而不是堆,不要弄混.int a ;int mai ...
- 《穷查理年鉴》诚实 & 希望 & 勇气 & 失败 & 改变(关于美好)
诚实 013.自欺是最常见的欺骗. 038.毫无顾忌进行欺骗的人是无所畏惧的. 043.问心无愧者永无所惧. 068.诚实的人从欺诈人手中得到的买卖,我们从争论中得到真理. 134.没有欺骗就没有信任 ...
- Python 导入模块的两种方法:import xxx 和from...import xxx
import 方式导入模块 import tool.getsum.add # 导入模块,优先会从启动文件的当前目录开始寻找 # 如果找到,就使用 # 如果找不到,会在系统模块存放目录去 tool.ge ...
- Python数据类型--字典(dict)
Python中的字典是键值对(key-value)的无序集合.每个元素包含"键"和"值"两部分,这两部分之间使用冒号分隔,表示一种对应关系.不同元素之间用逗号分 ...
- Java 10 种常用第三方服务
严格意义上说,所有软件的第三方服务都可以自己开发,不过从零到一是需要时间和金钱成本的.就像我们研发芯片,投入了巨大的成本,但仍然没有取得理想的成绩,有些事情并不是一朝一夕,投机取巧就能完成的. Jav ...
- 三门峡6378.7939(薇)xiaojie:三门峡哪里有xiaomei
三门峡哪里有小姐服务大保健[微信:6378.7939倩儿小妹[三门峡叫小姐服务√o服务微信:6378.7939倩儿小妹[三门峡叫小姐服务][十微信:6378.7939倩儿小妹][三门峡叫小姐包夜服务] ...
- Jmeter之参数化函数助手__CSVRead
1.在Tool->函数对话框中选择__CSVRead,2处填写测试用例的文档地址(测试用例要以csv格式保存),3处是测试用例中参数的位置,第一栏参数的CSV文件列号填0,第二栏参数的CSV文件 ...