前言
一名优秀的程序员是一名出色的侦探,每一次调试都是尝试破案的过程……本章将详细带你学习实用调试技巧!正式开启DEBUG生活。
一、调试(Debug)
0x00 何为调试
一名优秀的程序员是一名出色的侦探,每一次调试都是尝试破案的过程……
📚 定义:调试,又称除错,是发现和减少计算机程序电子仪器设备中程序错误的一个过程;
0x01 调试的基本步骤
📚 基本步骤:
① 发现程序错误的存在;
✅ 能够发现错误的人:
⑴ 程序员,自己发现;
⑵ 软件测试人员,测试软件;
⑶ 用户,代价严重;
📜 箴言:要善于承认自己的错误,不能掩盖错误;
② 以隔离、消除等方式对错误进行定位;
✅ 能知道大概在什么位置,再确定错误产生的原因是什么;
③ 提出纠正错误的解决方案;
④ 对程序错误订正,重新调试;
二、Debug和Release的介绍
0x00 对比
📚 Debug 通常称为调试版本,它包含调试信息,并且不做任何优化,便于程序员调试程序;
📚 Release 称为发布版本,他往往是进行了各种优化,使得程序在代码大小和运行速度上是最优的,以便用户更好的使用;
📌 注意事项:Release 版本是不能调试的;
💬 用 Debug 和 Release 分别运行:
int main() { char* p = "hello,world!"; printf("%s\n", p); return 0; }
🚩 Debug 环境下运行结果如下:
🚩 Release 环境下运行结果如下:
💡 我们可以发现:Release进行了优化,使得程序在运行速度和代码大小上是最优的;
💬 Debug和Release反汇编展示对比:
0x01 Release的优化
❓ 使用Release版本调试时,编辑器进行了那些优化呢?
💬 请看下列代码:
int main() { int arr[10] = {0}; int i = 0; for(i=0; i<=12; i++) { arr[i] = 0; printf("hehe\n"); } return 0; }
🚩 如果是 debug 模式去编译,程序结果是 死循环:
🚩 如果是 release 模式去编译,程序没有死循环:
💡 因为 release 的优化,避免了死循环的发生;