参考来源:博文01https://blog.csdn.net/qq_37941471/article/details/81476942
(动手实践才是真理)
文章目录
一、博文01
1. 启动调试 (两步): (1)gcc -g test.c (2)gdb a.out
(1)gcc -g test.c // 编译文件,生成可执行程序,并且必须给文件加上调试信息
(2)gdb a.out // 开始启动调试
补充:
gcc –g test.c –o haha // 编译文件,生成可执行程序haha,并且给文件加上调试信息
- 显示当前的代码:l (list的简写)
另外:
l 函数名 // 显示这个函数的代码(默认显示10行)
如果想继续查看,继续输入该命令
3. 在某一行打断点(break):b 行号
b(break)
4. 开始运行程序:r( run )
5. 逐步执行:s( step ) ,类似于VS中的F11
6. 重复上条命令:不输入任何命令,直接enter
7. 查看某个变量的变化:print 变量名
8. 查看变量的类型:whatis 变量名
9. 看函数的堆栈:bt
10. 结束调试:finish
11. 进入下一次调试:n( next )
12. 退出(quit)调试:q
二、简单总结
黑马程序员:本节课所讲知识总结
- 程序中除了一目了然的Bug(漏洞,臭虫)之外都需要一定的调试手段来分析到底错在哪。到目前为止 我们的调试手段只有一种:根据程序执行时的出错现象假设错误原因,然后在代码中适当的位置插入printf,执行程序并分析打印结果,如果结果和预期的一样,就基本上证明了自己 假设的错误原因,就可以动手修正Bug了,如果结果和预期的不一样,就根据结果做进一步 的假设和分析。本章我们介绍一种非常强大的调试工具gdb,可以完全操控程序的运行,使 得程序就像你手里的玩具一样,叫它走就走,叫它停就停,并且随时可以查看程序中所有的 内部状态,比如各变量的值、传给函数的参数、当前执行的语句位置等。掌握了gdb的用法 以后,调试的手段就更加丰富了。但要注意,即使调试的手段非常丰富了,其基本思想仍然 是“分析现象->假设错误原因->产生新的现象去验证假设”这样一个循环,根据现象如何假 设错误原因,以及如何设计新的现象去验证假设,这都需要非常严密的分析和思考,如果因 为手里有了强大的工具就滥用,而忽视了严谨的思维,往往会治标不治本地修正Bug,导致 一个错误现象消失了但Bug仍然存在,甚至是把程序越改越错。本章通过几个初学者易犯的 错误实例来讲解如何使用gdb调试程序,在每个实例后面总结一部分常用的gdb命令。
- Gdb调试总结
1.启动gdb
start 只执行一步
n next 单步
s step(单步) 可以进入到函数体内部
c continue 直接执行代码停在断点的位置
2.查看代码
l list
l 10 函数名
l filename: 行号 函数名
3.设置断点
设置当前文件断点
b—— break
b 10
b 10 (函数名) :给某个函数的第10行设置断点
b filename:行号 (函数名)
设置指定文件断点
b filename:行号 (函数名)
设置条件断点:
b 10 if 变量名19 如: b 10 if value19
删除断点:
delete del d
d 断点的编号
4.参看设置的断点
获取断点编号:
info i
info b
5.开始执行gdb调试
执行一步操作
继续执行
执行多步,直接停在断点处
6. 单步调试
7.查看变量的值 p print
8.查看变量的类型 ptype 变量名
9.设置追踪变量
自动打印变量的值: display 变量名
取消追踪变量 undisplay 编号 (不会用的百度)
上面的编号:获取编号 info display
手动打印变量的值:print——p
获取变量对应的类型:ptype
9.跳出循环 u
10.退出gdb调试
quit q