releaseVSdebug模式
- 程序的发布方式有两种,debug模式和release模式
- Linux gcc/g++出来的二进制程序,默认是release模式
- Linux gcc/g++要使其debug模式编译,加上-g选项
- 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项
- debug模式:编译器形成可执行程序的时候,会给可执行程序添加调试信息!
- debug模式可以被调试
- release模式不可被调试
- 用户使用都是release版本,测试测得是release版本
【对比1】
【对比2】
readelf -S process.c-debug | grep -i debug readelf -S process.c | grep -i debug
使用命令
sudo yum -y install gdb //没安装gdb的小伙伴安装下
- 打断点(确定bug范围)
- 启用run到进入范围
- 启用next / step 逐过程/逐语句调试;step进入函数调试
- run / countinue:是重新和从当前位置开始调试
- finish是跳过函数停止(只执行函数)
- until X是结束循环调试
- 调试过程中查看变量信息
NO1运行
- gdb 可调式文件(含调试信息):开始启动调试。
- quit(q)/ ctrl+d :退出调试(结束调试)。
- run(r):运行程序。从开始连续而非单步执行程序。从头开始,有断点停下F5。
- continue(c):从当前位置开始连续而非单步执行程序。(从当前位置开始,会直接执行完函数)。
- next(n):单条执行,逐过程(≈F10)(把函数当成一条语句执行完成)。
- step(s):进入函数调用,逐语句(≈F11)。
- finish:执行到当前函数返回,然后停止下来等待命令。
- until X(行号):从当前位置跳转至X行号。(执行完X行号以前得程序)
- 所有的命令必须在run之后才能启用,run在遇到断点才会停下,不然会直接执行完成。
NO2查看
- list / l 行号:显示源代码,从头开始只显示10行。重复输入:接着上次的位置往下显示
- list 15:15不会在开头,在中间位置,gdb会把要查看15的内容上下文全部展示出来。
- list / l 函数:显示某个函数的源代码
- info break:查看断点信息
- info(或i) breakpoints:参看当前设置了哪些断点(同上)
- print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数
- p 变量:打印变量值
- p {变量1,变量2}:查看多个变量
- set var 变量=修改后的值:修改变量值(一般用于判断条件/判断语句)
- display 变量名:跟踪查看一个变量,每次停下来都显示它的值
- undisplay :取消对先前设置的那些变量的跟踪
- breaktrace(或bt):查看各级函数调用及参数
- info(i) locals:查看当前栈帧局部变量的值
NO3断点
- break(b)行号:在某一行设置断点。
- break 函数名:在某个函数的开头设置断点。
- delete breakpoints(断点编号):删除所有断点
- delete breakpoints (断点序号):删除序号为n的断点
- disable breakpoints(断点编号):禁用断点
- enable breakpoints(断点编号):启用断点
- 注意如果不结束调试,假设只有序号1断点,删除序号1断点,再次打断点序号从2开始,不是从1开始。断点编号在没有退出调试之前是一个增长的计数器
总结
- 创建项目test-debug
- gdb -g test-debug:开始调试
- ctrl + d 或者 quit(q) :退出调试
- list/l 行号:显示test-debug源代码,接着上次的位置往下列,每次列10行。
- list/l 函数名:列出某个函数的源代码。
- r或run:运行程序。再次重新运行程序
- n 或 next:单条执行。
- s或step:进入函数调用
- break(b) 行号:在某一行设置断点
- break 函数名:在某个函数开头设置断点
- info break :查看断点信息。
- finish:执行到当前函数返回,然后挺下来等待命令
- print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数
- p 变量:打印变量值。
- set var:修改变量的值
- continue(或c):从当前位置开始连续而非单步执行程序
- run(或r):从开始连续而非单步执行程序
- delete breakpoints:删除所有断点
- delete breakpoints n(序号):删除序号为n的断点
- disable breakpoints:禁用断点
- enable breakpoints:启用断点
- info(或i) breakpoints:参看当前设置了哪些断点
- display 变量名:跟踪查看一个变量,每次停下来都显示它的值
- undisplay:取消对先前设置的那些变量的跟踪
- until X行号:跳至X行
- breaktrace(或bt):查看各级函数调用及参数
- info(i) locals:查看当前栈帧局部变量的值
- quit:退出gdb
- breakpoints:是断点编号
🙂感谢大家的阅读,若有错误和不足,欢迎指正