单步执行——一步一行看清代码怎么走
断点停住后
程序在断点行暂停后,调试工具栏出现三个核心按钮:
| 按钮 | 名称 | 作用 |
|---|---|---|
| 向下箭头(越过) | Step Over | 执行当前行,不进入内部 |
| 向右箭头(进入) | Step Into | 进入当前行的方法调用内部 |
| 向上箭头(跳出) | Step Out | 在方法内部时,跳出去 |
Step Over(单步越过)
执行当前行代码。如果这行是一个方法调用,不进入方法内部,直接跳到下一行。
什么时候用:
- 你确定某个方法没问题,不想进去看
- 想快速浏览当前方法的执行流程
- 第一次调试,先粗粒度地跑一遍看看整体走向
// Step Over 演示
public void onClick(View v) {
User user = fetchUser(); // ← Step Over:fetchUser() 完整执行完,不进去
updateUI(user); // ← Step Over:updateUI() 完整执行完
}
Step Into(单步进入)
执行当前行,如果这行包含方法调用,进入那个方法的内部,停在方法的第一行。
什么时候用:
- 你怀疑某个方法有 bug,想进去看它内部怎么跑
- 想看某个库方法的内部实现(如果有源码的话)
- 跟踪调用链:谁调用了谁
// Step Into 演示
public void onClick(View v) {
User user = fetchUser(); // ← Step Into:进入 fetchUser() 方法内部
// 此刻你在 fetchUser() 的第一行
}
Step Out(单步跳出)
当你在某个方法内部时,Step Out 会继续执行完当前方法剩余的所有代码,然后回到调用这个方法的位置,停在那里。
什么时候用:
- Step Into 进了一个方法,看完了想快点出来
- 发现进错方法了,退回去
- 在深层嵌套里,不想一层一层 Step Out
// Step Out 演示
User fetchUser() {
int id = getUserId(); // Step Into:进了 getUserId()
// ... 看完了
return database.query(id); // Step Out:从 getUserId() 跳出来,回到 fetchUser()
}
实战示例
调试一个"按钮点击后没反应"的问题:
1. 在 Button.OnClickListener 的 onClick() 里设断点
2. Debug 启动 → 点击 Button → 断点停住
3. Step Into 进入 onClick()
4. Step Over 逐行走,看看每一步是否按预期执行
5. 如果有某个方法返回值不对 → Step Into 进去看那个方法内部
6. 找到变量值异常的位置 → 看 [变量检查] 面板
7. 修正代码 → 重新 Debug