GDB基本命令-从打开文件到调试结束

本文详细介绍GDB的基本命令及使用技巧,包括如何通过GDB进行文件编译、设置及管理断点、变量监视和修改、跟踪调试流程等。适合初学者及有一定经验的开发者学习和参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GDB基本命令-从打开文件到调试结束

 

  • 事前准备
    1 gcc -g -o 将原文件编译成能让gdb调试的目标文件
    2 gdb 打开要调试的目标文件
    3 set args  设置参数 
            或run的时候用run
    来实现
    4 show args 参看参数
    5 show environment 查看environment
    5 unset env 清除所有环境变量
    6 set environment 来设置一个环境变量VAR1
    设置/删除断点
    1 info sources  或 list   来查看文件,要不然都不知道应该在哪里设置断点
    2 查看断点 info breakpoints
    3 break
    4    tbreak 设置临时断点,到达后被自动删除
    5 enable
      enable delete
            enable once
    6 disable
    7 delete breakpoints  删除断点
      或单用delete而不加所有参数来删除所有断点
    ->断点进阶
    1 break test.c:5 设置断点到指定文件
    2 break 在内存某一个位置出暂停
    3 break  if  来设置条件断点
    4 condition   对已存在的断点附上条件
    5 command 能在第n个断点出设置命令
    开始调试
    0 run 程式开始执行
    1 step or s 单步执行 
    2 next or n非进入式单步执行,就是说,当调用其他函数时,不进入那个函数内部
    3 finish 一直运行到函数返回
    4 until 运行到函数某一行
    5 continue or cont 执行到下一个断点或程式结束
    6 return  改动程式流程,直接结束当前函数,并将指定值返回
    设置变量
    set
    1 set i = 5 改动程式中一个变量的值
    2 set $i =5 来设置一个pdb环境里自己的变量,该变量独立于程式,也就是说只有gdb认识
    获取程式信息
    1 监视变量
      print /fmt     打印信息
      fmt格式,有以下几种
      ------------------------------
       x  十六进制
      ------------------------------
       d  十进制
      ------------------------------
       u 无符号数
      ------------------------------
       o 八进制
      ------------------------------
       t  二进制
      ------------------------------
       a 十六进制打印
      ------------------------------
       c 字符格式
      ------------------------------
       f   浮点数
      ------------------------------
    2 追踪变量
      watch      追踪被赋值动作  eg. i = 4;
            rwatch    追踪读动作 eg. b = i;
            awatch    追踪所有动作
            del watchpoint .
      info display
      display
            show display
      del display
    3  监视内存
      x /
      Address能是内存地址或是指针,比如0x8799f000,p,&var
      fmt 由三部分组成 NFU,N表示要查看的长度,U为格式,其中有分为bhwg,分别表示以字节,半字,字,双字
      来显示。
       eg.
       (gdb) x argv[0]
       0xbfffff61: 0x6d6f682f
       (gdb) x /10cb argv[0]
       0xbfffff61: 47 ’/’ 104 ’h’ 111 ’o’ 109 ’m’ 101 ’e’ 47 ’/’ 67 ’C’ 104 ’h’
       0xbfffff69: 97 ’a’ 114 ’r’
       (gdb) x /10tb
       12
       0xbfffff6b: 01101100 01100101 01110011 00101111
       01110111 01101111 01110010 01101011
       0xbfffff73: 01110000 01101100
       (gdb) x /10th
       0xbfffff7f:          
       0110101101101111 0111010000101111 0110000100000000
       01100010000000110001100000000 0110010000000000 0110010100000000 0110011000000000
       0xbfffff8f: 0110011100000000 0101011000000000
       (gdb)
    4 查看总的frame信息
      backtrace 或 bt
      说明:frame是函数调用时候所产生的堆栈,存储函数被调用的信息
    5 选择要查看的frame
         frame
### 使用 GDB 进行程序调试 #### 编译带有调试信息的程序 为了能够使用 GDB 正常调试程序,在编译阶段需要加入 `-g` 参数,以便生成供 GDB 使用的调试信息。这一步非常重要,因为只有这样才能让 GDB 将可执行文件中的指令映射回源代码的具体位置[^2]。 ```bash gcc -g program.c -o program ``` #### 启动 GDB 并加载目标程序 可以通过 `gdb` 命令启动调试器,并指定待调试的目标程序作为参数: ```bash gdb ./program ``` 一旦进入 GDB 的交互环境,可以使用多种命令来控制和分析程序行为。 --- #### 设置断点 断点是调试过程中非常重要的功能之一,可以在特定代码行暂停程序执行以检查其状态。 - 在某一行设置断点:`(gdb) break <line_number>` 或 `(gdb) b <line_number>`[^1]。 - 在某个函数入口处设置断点:`(gdb) break function_name` 或 `(gdb) b function_name`[^1]。 例如: ```bash (gdb) break main ``` 查看已设置的所有断点: ```bash (gdb) info breakpoints ``` 如果不再需要某些断点,可以直接删除它们: ```bash (gdb) delete breakpoint <number> ``` --- #### 开始运行程序 当一切准备就绪后,可以使用以下命令开始运行程序: - 如果不需要任何参数,则直接运行:`(gdb) run` 或 `(gdb) r`[^1]。 - 若需传递命令行参数给程序,则附加这些参数即可:`(gdb) run arg1 arg2 ...`。 --- #### 单步调试 GDB 提供了两种主要方式来进行单步调试- **逐过程 (Next)**:不进入函数内部而直接跳过整个函数体的执行:`(gdb) next` 或 `(gdb) n`[^1]。 - **逐语句 (Step)**:会深入到函数内部逐步执行每一行代码:`(gdb) step` 或 `(gdb) s`。 --- #### 查看变量值与表达式计算 在任意时刻都可以利用以下方法获取当前上下文中变量或者复杂表达式的值: - 打印单一变量的值:`(gdb) print variable_name` 或 `(gdb) p variable_name`[^1]。 - 计算更复杂的 C/C++ 表达式的结果:`(gdb) print expression`。 --- #### 控制流管理 除了简单的单步步进外,还可以采取更多高级手段调整程序流向: - 继续执行直到遇到下一个断点为止:`(gdb) continue` 或 `(gdb) c`[^1]。 - 结束当前正在处理的子例程并回到调用它的地方:`(gdb) finish`。 --- #### 栈帧操作 对于多层嵌套调用的情况,理解堆栈结构至关重要: - 展示完整的调用链路详情:`(gdb) backtrace` 或 `(gdb) bt`。 - 切换至不同的活动框架去审查相应作用域内的数据成员:`(gdb) frame number` 或 `(gdb) f number`。 --- #### 修改变量或程序状态 有时可能希望人为干预某些条件测试结果或是强制改变对象属性值来做进一步验证实验: - 更改现有实体的新赋值情况:`(gdb) set variable=desired_value`。 --- #### 特殊场景支持——Fork 处理策略设定 针对涉及并发逻辑的应用场合,默认情况下派生出来的子线程不会自动纳入监控范围之内;不过借助专门选项却能实现这一目的: - 关闭分离机制使得所有分支均受控于同一个实例之下共同运作:`(gdb) set detach-on-fork off`[^4]。 --- #### 退出 GDB 环境 完成全部任务之后记得妥善关闭工具以免残留资源占用现象发生: ```bash (gdb) quit ``` --- ### 示例代码演示 假设有一个简单的 C 文件如下所示: ```c #include <stdio.h> int add(int a, int b){ return a+b; } void multiply(){ printf("%d\n",add(3,7)); } int main() { multiply(); return 0; } ``` 按照前述指导步骤依次实践各项基础技能要点直至熟练掌握为止!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值