Linux: 调试器gdb/cgdb

文章目录

  • 调试器gdb/cgdb
  • [gdb 核心调试命令(按调试流程分类)](#gdb 核心调试命令(按调试流程分类))
  • [命令 全称 功能](#命令 全称 功能)
  • cgdb
  • cgcb操作

调试器gdb/cgdb

我们发布软件有debug和release版本

gcc/g++默认模式是release模式,不是dubug
要使用gdb调试,必须在源代码生成二进制程序的时候, 加上-g 选项,如果没有添加,程序无法被编译,程序要调试必须是debug模式。

这样我们make后就是debug程序。也能运行,但是体积更大,因为内部有调试信息,可以供程序员调试。

gdb 核心调试命令(按调试流程分类)

  1. 基础控制:启动、暂停、继续执行
  1. 断点管理:控制程序暂停位置

命令 全称 功能

  1. 查看与修改数据:变量、内存、表达式
    程序暂停时(如断点触发后),可查看或修改变量、内存值,验证逻辑是否正确。
  1. 调用栈分析:定位函数调用关系
    当程序崩溃或暂停时,通过调用栈(Call Stack)可查看 "当前执行到哪个函数,这个函数由谁调用,上层还有哪些函数",快速定位问题所在。
  1. 其他实用功能

五、常用快捷键

gdb 支持类似 shell 的快捷键,提高操作效率:
↑/↓:查看历史命令(避免重复输入)

Tab:自动补全命令或文件名

Ctrl + c:中断当前正在执行的 gdb 命令(如程序运行时强制暂停)

cgdb

要先安装

然后cgdb xxx

这样上面是代码界面,下面是调试界面,比gdb方便多了

cgcb操作


c跳到下一个断点,条件断点的使用c跳,可以使用条件都安到也可以condition 添加条件断点

每一次函数调用的过程就是形成栈栈帧的过程

函数调用就是入栈的过程

这里result具有常量属性,是写在寄存器中,具有常属性

这里汇编语言就是call了Sum函数后把值存在寄存器中,然后把eax寄存器里的值赋值给函数内部栈上的一个临时变量n。
注意:

• 条件断点添加常⻅两种⽅式:1. 新增 2. 给已有断点追加

• 注意两者的语法有区别,不要写错了。

• 新增: b ⾏号/⽂件名:⾏号/函数名 if i == 30(条件)

• 给已有断点追加:condition 2 i==30, 其中2是已有断点编号,没有if