实用调试技巧

1 什么是bug


现在提起bug,大都想到的是「程序错误、漏洞」,其实bug的原意为「昆虫」。为什么变成这样呢? 因为世界上第一个程序错误就是由一只昆虫所造成的。

2 调试

2.1 调试是什么?

调试(英语:Debugging / Debug),又称除错,是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。

2.2 调试的基本步骤

  1. 发现程序错误的存在
  2. 以隔离、消除等方式对错误进行定位
  3. 确定错误产生的原因
  4. 提出纠正错误的解决办法
  5. 对程序错误予以改正,重新测试

2.3 Debug和Release的介绍

  • Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
  • Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。

3 Windows环境调试介绍

3.1 调试环境的准备


在环境中选择 debug 选项,才能使代码正常调试。

3.2 学会快捷键

最常使用的几个快捷键:
F5

  • 启动调试,经常用来直接跳到下一个断点处。
    F9
  • 创建断点和取消断点
  • 断点的重要作用,可以在程序的任意位置设置断点。
  • 这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去。
    F10
  • 逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。
    F11
  • 逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部(这是最常用的)。
    CTRL + F5
  • 开始执行不调试,如果你想让程序直接运行起来而不调试就可以直接使用。

3.3 调试的时候查看程序当前信息

3.3.1 查看临时变量的值

在调试开始之后,用于观察变量的值。

3.3.2 查看内存信息


3.3.3 查看调用堆栈


3.3.4 查看汇编信息

3.3.5 查看寄存器信息


一定要熟练掌握调试技巧。
初学者可能80%的时间在写代码,20%的时间在调试。但是一个程序员可能20%的时间在写
程序,但是80%的时间在调试。
我们所讲的都是一些简单的调试。
以后可能会出现很复杂调试场景:多线程程序的调试等。
多多使用快捷键,提升效率。

4 如何写出好(易于调试)的代码

4.1 优秀的代码

  1. 代码运行正常
  2. bug很少
  3. 效率高
  4. 可读性高
  5. 可维护性高
  6. 注释清晰
  7. 文档齐全

4.2 示范

模拟实现strcpy

char * strcpy(char * dst, const char * src)
{
    char * cp = dst;
assert(dst && src);
    while( *cp++ = *src++ )
       ;   /* Copy src over dst */
    return( dst );
}

** 注意 **

  1. 分析参数的设计(命名,类型),返回值类型的设计。
  2. 野指针,空指针的危害。
  3. assert的使用。
  4. 参数部分 const 的使用。
  5. 注释的添加

4.3 const的作用

void test1()
{
	int n = 10;
	int m = 20;
	int* p = &n;
	*p = 20;//ok
	p = &m; //ok
}
void test2()
{
	//代码2
	int n = 10;
	int m = 20;
	const int* p = &n;
	//*p = 20;//no
	p = &m; //ok
}
void test3()
{
	int n = 10;
	int m = 20;
	int* const p = &n;
	*p = 20; //ok
	//p = &m;  //no
}
int main()
{
	//测试无cosnt的
	test1();
	//测试const放在*的左边
	test2();
	//测试const放在*的右边
	test3();
	return 0;
}

const修饰指针变量的时候:

  1. const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。但是指针变量本身的内容可变。
  2. const如果放在*的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指针指向的内容,可以通过指针改变。

5 编程常见的错误

5.1 编译型错误

  • 直接看错误提示信息(双击),解决问题。或者凭借经验就可以搞定。相对来说简单。

5.2 链接型错误

  • 看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。一般是标识符名不存在或者拼写错误。

5.3 运行时错误

  • 借助调试,逐步定位问题。最难搞。

温馨提示:

  • 做一个有心人,积累排错经验。
目录 简介 第一篇 基础与提高  实例1利用库函数编写基本显示程序  实例2变量属性  实例3运算符与类型  实例4关于程序结构  实例5显示函数曲线图  实例6二分法选代的应用  实例7多变的立方体  实例8一维整型数组应用(1)  实例9一维整型数组应用(2)  实例10一维整型数组应用(3)  实例11一维整型数组应用(4)  实例12二维数组应用(1)——显示杨辉三角  实例13二维数组应用(2)——魔方阵  实例14字符数组应用(1)——逻辑判断  实例15字符数组应用(2)——数据模拟  实例16二维数组应用——字符比较   实例17利用指针进行数据处理  实例18指针与字符串  实例19利用指针处理二维数组  实例20一级指针  实例21利用指针传递参数值  实例22结构体的应用  实例23链表的应用(1)  实例24链表的应用(2)  实例25链表的应用(3)  实例26共用体的应用  实例27枚举类型应用  实例28位运算  买例29义件加密  实例30文件的按记录随机读写 第二篇 图形与多媒体  实例31改变文字背景色  实例32及本颜色设置  实例33制作表格  实例34制作多样的椭圆  实例35美丽的透视图形  实例36错位窗口  实例37能移动的矩形  实例38多变的填充矩形  实例39黄黑相间的矩形与圆  实例40六叶图案  实例41特殊图案  实例42国际象棋棋盘  实例43制作楼梯  实例44使用线类型函数设置多个汉字  实例45彩色群点  实例46饼图  买例47产品折线图  实例48直方图  实例49变大变色的拒形与国  实例50多变的填充多边形  实例51流星球  实例52小球动态碰撞  买倒53多,曲线  实例54多变的圆与环  实例55优美的球体  实例56运动的小车  实例57统计动画消失次数  实例58运行的时钟  实例59直升飞机  实例60演绎“生命游戏”  实例61猜猜看  买例62艺术清屏  买倒63制作火焰  实例64动态绘制256条不同颜色的直线  实例65红绿蓝三原色渐变 第三篇 综合小程序  实例66两个矩阵相乘  实例67艺术钟  实例68家庭财务管理小程序  实例69用系统时间实现随机数  实例70闪动的多彩圆  实例71检查系统有无鼠标  实例72圆形光盘与矩形  实例73动态渐变图案  实例74往返两地间的小车  实例75飘扬的红旗  实例76显示蓝天白云图形  实例77百叶窗 第四篇 计算机等级考试上机试题(二级) 第五篇 计算机等级考试上机试题(三级)
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bria Griffin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值