适用版本:Dev-C++ 5.11,GDB调试器
核心能力:程序停在断点时,临时修改内存里变量的值,不用改源码、不用重新编译,快速测试不同分支。
一、两个窗口区别
1. 局部变量窗口
✅ 自动显示:当前函数作用域内所有局部变量,不需要手动添加
- 进入某个函数断点,自动刷新;跳出函数,自动更新变量列表
- 优点:省事;缺点:变量多的时候很乱,不能自定义表达式
注意:全局变量不会出现在局部变量窗口,全局变量需要加到【监视窗口】
2. 监视窗口(Watch / 添加查看)
✅手动自定义添加:变量、数组元素、指针解引用、逻辑表达式都可以
可以写:
i sum arr[3]*p i>10- 适合:只关心少数几个变量;查看全局变量、指针、自定义表达式
- 不会自动删除,多个断点之间保留监视项
打开位置:调试暂停后,左侧「Debug」标签页,同时包含局部变量、查看(Watch)、调用堆栈
二、如何动态修改变量的值(两种窗口操作一样)
操作步骤
- F5启动调试,程序命中断点暂停(必须暂停!运行状态不能改)
- 在【局部变量】或【监视窗口】找到目标变量
- 双击变量值那一栏(不是变量名)
- 删除原有数字,输入新值,回车确认
- 继续调试(F8/F9),程序就会使用你修改后的新值运行
示例代码,直接复制测试
#include<iostream>usingnamespacestd;intmain(){inta=10;// 在下面这一行打断点if(a>20){cout<<"a大于20"<<endl;}else{cout<<"a小于等于20"<<endl;}return0;}👉 调试停在断点,此时a=10。双击a的值,改成30,回车,再F8单步:会直接进入if(a>20)分支!
✨ 用途:快速测试边界情况,不用修改源代码。
三、支持修改的类型
- int、double:直接填数字,如
99、3.14 - char:单引号,
'A' - bool:true / false
- 指针:可以修改地址(慎用,容易野指针崩溃)
❌不能修改:常量const int、已经销毁的变量、不存在作用域的变量
四、常用配套操作
- 数组/结构体:点前面
+展开,单独修改里面每个成员 - 跨函数看变量:双击【调用堆栈】上层栈帧 → 局部变量窗口切换到上一层函数变量,也可以修改该层变量
⚠️ 切换栈帧只是查看,程序暂停位置没变;修改变量会直接修改内存真实值。
五、常见报错&坑
变量显示:Optimized out
原因:编译器优化,变量被优化掉。解决:工具→编译选项,无优化 + 产生调试信息Yes,Ctrl+F11全部重新编译。找不到变量 /
Not found in current context
当前暂停位置不在这个变量的作用域。局部变量生命周期结束,无法查看、无法修改。修改后不生效
① 没有回车确认;② 开了编译器优化;③ 修改的是上层栈帧变量,当前代码已经执行完这一行。修改指针后程序崩溃
修改成非法内存地址,访问野指针,直接程序停止。
六、GDB控制台等效命令(GUI窗口失效备用)
print a //查看a的值 set var a=30 //把变量a设置为30,等价窗口里手动修改