• 【gdb调试器】gdb的调试参数和使用方法


    GDB调试器

    • GDB(GNU Debugger)是一个用来调试C/C++程序的功能强大的调试器,是linux系统开发C/C++最常用的调试器
    • 程序员可以使用GDB来跟踪程序中的错误从而减少工作量
    • VSCode是通过调用GDB调试器来实现C/C++的调试工作的

    GDB主要功能

    1. 设置断点(断点可以是条件表达式)
    2. 使程序在指定代码行上暂停执行,便于观察
    3. 单步执行程序,便于调试
    4. 查看程序中变量值的变化
    5. 动态改变程序的执行环境
    6. 分析崩溃程序产生的core文件

    常用调试命令参数

    在调试开始时:执行gdb 可执行文件,进入gdb调试程序.常用参数如下:
    下面命令括号内为简写,比如run和r同意

    $(gdb) help(h)                 #查看命令帮助
    $(gdb) run(r)                  #重新开始运行文件
    $(gdb) start                   #单步执行
    $(gdb) list(l)                 #查看源代码,(list-n, 从第n行开始查看代码,list+函数名:查看具体函数)
    $(gdb) set                     #设置变量的值
    $(gdb) next(n)                 #单步调试(逐过程,  函数直接执行)
    $(gdb) step(s)                 #单步调试(逐语句:跳入自定义函数内部执行)
    $(gdb) backtrace(bt)           #查看函数调用的栈帧和层级关系
    $(gdb) frame(f)                #切换函数的栈帧
    $(gdb) info(i)                 #查看函数内部局部变量的数值
    $(gdb) finish                  #结束当前函数 返回函数调用点
    $(gdb) continue(c)             #继续运行
    $(gdb) print(p)                #打印值和地址
    $(gdb) quit(q)                 #退出gdb
    $(gdb) x                       #查看内存x/20xw 显示20个单元, 16进制, 4字节每单元
    $(gdb) run argv[1] argv[2]     #调试时命令行传递参数
    $(gdb) break+num(b)            #在第num行设置断点
    $(gdb) info breakpoints(i b)   #查看所有设置的断点
    $(gdb) delete breakpoints num(d)   #删除第num个断点
    $(gdb) display                 #追踪查看具体变量值
    $(gdb) undisplay               #取消追踪观察变量
    $(gdb)  watch                  # 被设置观察点的变量发生修改时,打印显示
    $(gdb) i watch                 #显示观察点
    $(gdb) enable breakpoints      #启用断点
    $(gdb) disable breakpoints     #禁用断点
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    小例子测试gdb

    我们的sum.cpp源码如下:

    #include
    using namespace std ;
    
    int main(int argc, char * argv[])
    {
    	int N = 100 ;
    	int sum = 0 ;
    	int i = 1 ;
    	
    	while(i <= N)
    	{
    		sum = sum + i ;
    		i = i + 1 ;
    	}
    	
    	cout << "sum = " << sum << endl ;
    	cout << "The program is over " << endl ;
    	
    	return 0 ;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    编译生成可执行文件

    在编译时一定要加入-g参数来允许GDB调试(尽管这会使可执行程序耗费更多资源):

    g++ -g sum.cpp -o sum
    
    • 1

    调试查看

    1. 输入 gdb num 进入调试界面
    2. 在命令行模式下:set nu显示行号
    • 建议调试GDB时,另起一控制台显示程序和行号,如下:
      在这里插入图片描述

    • 给13行打断点:b 13

    • 运行至断点run

    • 查看一次i的值,print i ,只会查看一次

    • 持续查看i的值,display i ,在每次执行,都会展示一次i的值

    • 退出gdb调试q

    • 按enter会执行上一条指令

  • 相关阅读:
    跳台阶问题(类似斐波那契数列)
    【CSS3】CSS3 动画 ⑥ ( 动画属性示例 | 精灵图帧动画效果实现 )
    儿童玩具在美国市场需要注意什么?
    〖Python 数据库开发实战 - MySQL篇⑲〗- Having子句的使用
    Android四大组件详解
    使用stream实现两个list集合的合并(对象属性的合并)
    建表时如何合理选择字段类型
    iOS 项目避坑:多个分类中方法重复实现检测
    解决Oracle数据库中日期格式不识别的问题
    「项目实战」一文读懂思科网络设备IOS系统
  • 原文地址:https://blog.csdn.net/Eric_Sober/article/details/126247096