Dev-C++ 机试调试

适用场景:复试上机时使用 Dev-C++ 编写和调试 C/C++ 程序。
目标:把最常用的环境配置、调试流程、代码片段和提交前检查集中到这一份。

1. 先把环境配对

1.1 常用界面操作

  • Tools 下的环境设置可以切换界面语言。
  • Ctrl + 鼠标滚轮 可以放大或缩小编辑器字体。

1.2 编译与调试选项

进入 Tools > Compiler Options,重点确认这几项:

  • 编译参数建议包含:
1
-g -O0 -std=c++11 -Wall -Wextra -DLOCAL
  • 关闭优化:调试阶段优先用 -O0
  • 打开调试信息:在代码生成或链接相关选项里,把 Generate debugging information / 产生调试信息 设为 Yes
  • 修改编译选项后,执行一次 Rebuild All,不要只点普通编译。

说明:

  • -g:让断点、单步、变量查看生效。
  • -O0:避免优化导致行号乱跳、变量被优化掉。
  • -DLOCAL:方便在本地打开调试输出,提交前再关闭。

2. 上机时最实用的操作顺序

  1. 先把题目输入格式确认清楚,写最小可运行版本。
  2. 编译一次,先排掉语法错误和头文件问题。
  3. 用最小样例跑通,再测边界样例。
  4. 如果结果不对,优先用“断点 + Watch + 少量输出”定位。
  5. 如果程序崩溃,先查数组越界、空指针、循环边界。
  6. 提交前关闭调试开关,重新编译,再跑一遍样例。

3. Dev-C++ 里怎么调试最有效

3.1 断点打在哪里

  • 循环问题:打在循环入口、循环体第一行、下标更新前。
  • 分支问题:打在 if / else if 判断前。
  • 指针问题:打在 *pa[i]node->next 这类访问前。
  • 函数问题:打在调用前和函数入口处。

不要一开始满屏断点。先用 2 到 4 个关键断点缩小范围。

3.2 单步执行怎么选

  • Step Over:执行当前行,不进入函数内部。默认优先用它。
  • Step Into:进入函数内部。怀疑子函数有问题时再用。
  • Step Out:从当前函数退回调用处。进太深时很有用。
  • Continue:继续运行到下一个断点。

3.3 Watch 盯哪些变量

优先盯这些:

  • 循环变量:ijk
  • 边界变量:nmlen
  • 结果变量:anssumcnt
  • 指针或节点:pheadtail
  • 当前读入值:xych

建议一次只加 3 到 5 个最关键变量,避免界面太乱。

3.4 调试输出什么时候更快

当循环很多、断点停太频繁时,直接加少量输出更快:

1
cerr << "DEBUG i=" << i << " a[i]=" << a[i] << " sum=" << sum << '\n';

建议统一加 DEBUG 前缀,提交前一起删掉或通过宏关闭。

4. 常见问题排查顺序

4.1 数组越界

  • 检查下标是否可能 < 0>= n
  • 重点盯 ijn
  • a[i] 访问前打断点

4.2 死循环

  • 看循环变量是否真的在变化
  • 看退出条件是否有机会满足
  • 打印每轮的 i/j/cnt/sum

4.3 指针异常

  • 解引用前先判断是否为 nullptr
  • 检查是否访问了失效对象
  • 链表重点看 next,树结构重点看左右孩子

4.4 输入输出异常

  • 检查读入格式是否和题目一致
  • 不要混用 cin/coutscanf/printf
  • 对关键读入值做短输出确认

4.5 断点失效

  • 通常是没开 -g
  • 或者改完编译选项后没 Rebuild All
  • 或者优化没有关掉

5. 机试时可直接复制的代码片段

5.1 快速输入输出

1
2
3
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);

5.2 本地调试开关

1
2
3
4
5
6
7
#ifdef LOCAL
#define DBG(x) cerr << #x << " = " << (x) << '\n'
#define LOG(msg) cerr << msg << '\n'
#else
#define DBG(x)
#define LOG(msg)
#endif

5.3 打印 vector

1
2
3
4
5
6
7
8
9
10
11
#ifdef LOCAL
template <class T>
void print_vec(const vector<T>& v) {
cerr << "[";
for (size_t i = 0; i < v.size(); ++i) {
if (i) cerr << ", ";
cerr << v[i];
}
cerr << "]\n";
}
#endif