背景
1.1.前提知识
程序的发布方式有两种, debug模式和release模式
Linux gcc/g++出来的二进制程序, 默认是release模式
要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项
![](https://i-blog.csdnimg.cn/blog_migrate/44332e95e229d409f116d91d21fa0b24.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3deac0efe543d0a3dc19e40dbcf9435c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3546d87635aac4eb0277282f49019138.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d1e2fb46a7a8ae9f20fdfad669646bca.png)
windows上的调试方法有区别吗?
1.调试思路是一样的
2.调试的操作方式,一定是不一样的(命令行调试)
开始使用
2.1.安装gdb
sudo yum install -y gdb
2.2.使用
gdb binFile 退出: ctrl + d 或 quit /q
2.2.1.显示binFile源代码(list/l)
一般list/l会记住上一次显示的行数,接着上次的位置往下列,每次列10行。
list/l 【行号】:从行号开始往下列10行。
list/l 【函数名】 :列出某个函数的源代码。列10行。
![](https://i-blog.csdnimg.cn/blog_migrate/fcee1b1fa45bab69db8843c787252c4c.png)
2.2.2.添加/删除断点(break/b)
break/b 行号:在某一行设置断点.
![](https://i-blog.csdnimg.cn/blog_migrate/746cbe780b308afdda5ea831bc25da1b.png)
delete breakpoints / d:删除所有断点 delete breakpoints / d 【n】:删除序号为n的断点(n不是行号)
info b :查看断点
info(或i) breakpoints:参看当前设置了哪些断点
![](https://i-blog.csdnimg.cn/blog_migrate/6d711590bbefc9e04f9e7f75f9334e97.png)
disable breakpoints:禁用断点(遇到断点就不会停下来)
(enable breakpoints )/ enable:启用断点
disable breakpoints 【序号】:禁用某一个断点。
(enable breakpoints )/ enable 【序号】:启用某一个断点
2.2.3.查看(info)(p)(display)
info b/break :查看当前所有断点。
![](https://i-blog.csdnimg.cn/blog_migrate/1d2f1a300993167df00a3e073d0d0b0b.png)
info/i locals:查看当前栈帧局部变量的值。
p 【变量名】打印变量
![](https://i-blog.csdnimg.cn/blog_migrate/2d990ef034f731df8d3ee5ca1b2e8f1f.png)
display 变量名:跟踪查看一个变量,每次停下来都显示它的值 。(也可以查看地址)
![](https://i-blog.csdnimg.cn/blog_migrate/b802b6a7db66988103abeedbccc6817c.png)
undisplay:全部取消对先前设置的那些变量的跟踪。
undisplay 【序号】:取消对这个变量的跟踪。
![](https://i-blog.csdnimg.cn/blog_migrate/6d632288011787e35e6b5884e186ff44.png)
2.2.4.运行调试(r/run)(n/next)(s/stop)(c/continue)
run/r:从开始连续而非单步执行程序(调试运行)
n/next:单条执行。 (逐过程)
s/step:进入函数调用(逐语句)
continue/c:从当前位置开始连续而非单步执行程序,也就是从当前位置开始到下一个断点或者结束。
finish:执行完当前函数,然后停下来等待命令 。可以帮我们快速的甄别那个函数出问题了。
until 【行号】:跳至X行。(可能不是预期行,去掉空格/无用的符号)
2.2.5.查看调用堆栈(bt)
bt :查看调用堆栈。
2.2.6.修改参数的值
set 【var】:修改变量的值,根据我们的需要修改临时变量的值
理解
3.1.f5 / ctrl+f5 / shift+f5
f5:调试运行,有断点直接停下来。 (r/run)
ctrl+f5:不调试执行,在断点不停。
shift+f5:取消调试。(q/quit)
f11:逐个语句(s/step)
f10:逐过程(n/next)