前言
当我们在vscode等IDE上编写代码出错时,通常会进行调试,有些人会通过打印数据来找bug,有些人则会使用调试工具,然而当我们在Linux系统中编写代码时却无法这么方便的使用图形化界面调试工具,但还是有调试工具的——gdb,今天我们就来讲述gdb的使用~
背景
程序的发布方式有两种,debug模式和release模式
Linux gcc/g++出来的二进制程序,默认是release模式
要使用gdb调试,必须在源代码生成二进制程序的时候, 加上-g选项
如下:
测试代码:
#include <stdio.h> int add(int a,int b) { return a+b; } int main() { int i=0; int a=1,b=1; for(i;i<10;++i) { printf("hello linux\n"); } int c=add(a,b); printf("%d",c); return 0; }
配置makefile文件
gtest-debug:gtest.c gcc -o gtest-debug gtest.c -g .PHONY:clean clean: rm -f gtest-debug
gdb的使用
调试命令:
gdb gtest-debug
gtest-debug调试过程中常用的命令:
- ctrl + d 或 quit :退出
- list/l行号:显示binFile源代码,接着上次的位置往下列,每次列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
实际应用
看过上面的命令后,我们通过实际的例子来掌握命令的使用。
示例1
- gdb gtest-debug:进入调试
示例2
- list/l 行号:显示gtest源代码,接着上次的位置往下列,每次列10行。
- 连续回车会执行上次输入的命令
示例3
- list/l 函数名:列出某个函数的源代码。
示例4
- r或run:运行程序。
示例5
- break(b) 行号:在某一行设置断点
- run(或r):从开始连续而非单步执行程序
- n 或 next:单条执行。
示例6
- print ( p ):打印表达式的值,通过表达式可以修改变量的值或者调用函数
- p 变量:打印变量值。
- continue(或c):从当前位置开始连续而非单步执行程序
- s或step:进入函数调用
示例7
- delete breakpoints:删除所有断点
- delete breakpoints n:删除序号为n的断点
- info(或i) breakpoints:参看当前设置了哪些断点
- display 变量名:跟踪查看一个变量,每次停下来都显示它的值
- undisplay:取消对先前设置的那些变量的跟踪
示例8
- until X行号:跳至X行
示例9
ctrl + d 或 quit :退出
后记
通过上面对于gdb的例子应该可以让你很容易明白gdb的使用,但是实际学习中,调试并不常用,所以只需要记得个大概就行。