备案 控制台
开发者社区 开发与运维 文章 正文

常用的调试技巧(如何检测bug)(一)

简介: 常用的调试技巧(如何检测bug)

1. 什么是bug?

7d1f75ad62e74ce196fd9bb0304823f0.png 第一次被发现的导致计算机错误的飞蛾,也是第一个计算机程序错误。


1944年世界上第一台计算机马克1号诞生,在世界上第一位女程序员格蕾丝-霍普接手下,顺利改造成马克二号,


1946年的一天,霍普敲代码的时候发现计算机发生了故障,就在马克二号的继电器触点里,找到了一只被夹扁的小飞蛾。


正是这只小虫子卡住了机器的运行。


霍普顺手将飞蛾夹在工作笔记里,而备注的意思是臭虫,正是这一奇怪的称呼,奠定了Bug这个词在计算机世界的地位,bug也变成无数苦逼工程师的噩梦。这就是第一个bug的诞生。


2. 调试是什么?有多重要?


所有发生的事情都一定有迹可循,如果问心无愧,就不需要掩盖也就没有迹象了,如果问心有愧, 就必然需要掩盖,那就一定会有迹象,迹象越多就越容易顺藤而上,这就是推理的途径。 顺着这条途径顺流而下就是犯罪,逆流而上,就是真相。

一名优秀的程序员是一名出色的侦探。

       每一次调试都是尝试破案的过程

我们是如何写代码的?

76bfa4d82d0d446b938d6fe5b93be9e3.png

又是如何排查出现的问题的呢?

4e860b9d331d4281abfadf028c6673a0.png

拒绝-迷信式调试!!!!


2.1 调试是什么?

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


2.2 调试的基本步骤

发现程序错误的存在

以隔离、消除等方式对错误进行定位

确定错误产生的原因

提出纠正错误的解决办法

对程序错误予以改正,重新测试

2.3 Debug和Release的介绍。

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


代码:

#include <stdio.h>
int main()
{
 char *p = "hello bit.";
 printf("%s\n", p);
 return 0;
}

上述代码在Debug环境的结果展示:

0c84807b88424b57b5d24154c9bce8ae.png

上述代码在Release环境的结果展示

78b2dbc36dac49849e7e6b0d3b3fbfbe.pngDebug和Release反汇编展示对比:

7a9dd6b866d141f2bca2a646cc47901e.png

所以我们说调试就是在Debug版本的环境中,找代码中潜伏的问题的一个过程。

那编译器进行了哪些优化呢?

请看如下代码:

#include <stdio.h>
int main()
{
    int i = 0;
    int arr[10] = {0};
    for(i=0; i<=12; i++)
   {
        arr[i] = 0;
        printf("hehe\n");
   }
    return 0;
}

如果是 debug 模式去编译,程序的结果是死循环。

如果是 release 模式去编译,程序没有死循环。

那他们之间有什么区别呢?

就是因为优化导致的。

25289a42d236492cb8bb7a7cbbf948e5.png

变量在内存中开辟的顺序发生了变化,影响到了程序执行的结果。

3. Windows环境调试介绍

       注:linux开发环境调试工具是gdb,后期课程会介绍。

3.1 调试环境的准备

867bfa05efe445819c27e4523c1986d6.png

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

3.2 学会快捷键

1fb9a6bba2df44babe0122d214fa2b9f.png

最常使用的几个快捷键:


F5 启动调试,经常用来直接跳到下一个断点处。

F9 创建断点和取消断点 断点的重要作用,可以在程序的任意位置设置断点。 这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去。

F10 逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。

F11 逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部(这是最 长用的)。

CTRL + F5 开始执行不调试,如果你想让程序直接运行起来而不调试就可以直接使用。


想知道更多快捷键?点击我哟


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

3.3.1 查看临时变量的值 在调试开始之后,用于观察变量的值。

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

2ad4fcca1a664b4d8b8a6d04ed09dfd2.png

3.3.2 查看内存信息

在调试开始之后,用于观察内存信息

f98164e0fff044258128fe726f43eca4.png

3.3.3 查看调用堆栈

4ac9fa0e2249477cb6aab9fd32f64d29.png

通过调用堆栈,可以清晰的反应函数的调用关系以及当前调用所处的位置

3.3.4 查看汇编信息

在调试开始之后,有两种方式转到汇编:

(1)第一种方式:右击鼠标,选择【转到反汇编】:

e6de1cbe48b54f0cbc735a4194e5591d.png

(2)第二种方式:

0104c9d29ef14cb5a754a8f7690180c3.png

可以切换到汇编代码。

3.3.5 查看寄存器信息

a110fb6f32b34de28ea7dbf936b1b20d.png

可以查看当前运行环境的寄存器的使用信息

tiantiantiantian
目录
相关文章
橘子的分享
|
7月前
|
小程序 Android开发 iOS开发
小程序 | 小程序修复了一些bug
前段时间,有朋友反应小程序的今天吃个啥有bug,不能正常使用。
橘子的分享
87 0
techgeek
|
8月前
|
安全 编译器 Go
读<一例 Go 编译器代码优化 bug 定位和修复解析>
读<一例 Go 编译器代码优化 bug 定位和修复解析>
techgeek
84 0
游客zozj54deia4ba
|
8月前
|
存储 网络协议 C++
排错实战——通过对比分析sysinternals事件修复程序功能异常
解决问题的思路很重要
游客zozj54deia4ba
44 0
游客zozj54deia4ba
|
8月前
|
C++ Windows
排错实战——解救加载调试符号失败的IDA
为 IDA 加载调试符号
游客zozj54deia4ba
150 0
遇事问春风乄
|
10月前
|
安全 编译器 程序员
一定要掌握的实用调试技巧(vs2019)(上)
一定要掌握的实用调试技巧(vs2019)(上)
遇事问春风乄
76 0
遇事问春风乄
|
10月前
|
存储 编译器 C语言
一定要掌握的实用调试技巧(vs2019)(下)
一定要掌握的实用调试技巧(vs2019)(下)
遇事问春风乄
99 0
tiantiantiantian
|
程序员
常用的调试技巧(如何检测bug)(二)
常用的调试技巧(如何检测bug)
tiantiantiantian
97 0
游客c34tyqhlwd5qq
|
Java Python
Python开发基础总结(八)GC+代码错误检查+运行+性能+其他
Python开发基础总结(八)GC+代码错误检查+运行+性能+其他
游客c34tyqhlwd5qq
91 0
相信光的奥特王小懒
常见的Bug检查纠错(1)
常见的Bug检查纠错
相信光的奥特王小懒
82 0
常见的Bug检查纠错(1)
相信光的奥特王小懒
常见的Bug检查纠错(2)
常见的Bug检查纠错
相信光的奥特王小懒
99 0
常见的Bug检查纠错(2)

热门文章

最新文章

  • 1
    ​阿里巴巴“新六脉神剑”背后的故事
  • 2
    汇编(三)段地址、偏移地址、内存单元、寄存器、CS、IP、代码段、debug、实验题
  • 3
    一分钟了解阿里云产品:阿里云解析概述
  • 4
    阿里云异构计算发布:轻量级GPU云服务器实例VGN5i
  • 5
    数据结构-第二章-单链表-不带头节点实现各种基本功能
  • 6
    How to reset Juniper SSG5
  • 7
    交易中的大数据归谁所有?
  • 8
    《网络安全法》的顺利实施备受期待
  • 9
    再探Javascript词法作用域
  • 10
    全栈必备Linux 基础
  • 1
    基于小程序的网上商城设计+springboot+vue.js附带文章和源代码设计说明文档ppt
    21
  • 2
    基于小程序的学生知识成果展示与交流+springboot+vue.js附带文章和源代码设计说明文档ppt
    19
  • 3
    停车场微信小程序+springboot+vue.js附带文章和源代码设计说明文档ppt
    25
  • 4
    基于小程序的亿家旺生鲜云订单零售系统+springboot+vue.js附带文章和源代码设计说明文档ppt
    18
  • 5
    基于小程序的家政服务管理系统+springboot+vue.js附带文章和源代码设计说明文档ppt
    170
  • 6
    儿童预防接种预约微信小程序+springboot+vue.js附带文章和源代码设计说明文档ppt
    15
  • 7
    智慧旅游平台开发微信小程序+springboot+vue.js附带文章和源代码设计说明文档ppt
    7
  • 8
    基于小程序的会议发布与预约系统+springboot+vue.js附带文章和源代码设计说明文档ppt
    7
  • 9
    基于小程序的汽车预约维修系统+springboot+vue.js附带文章和源代码设计说明文档ppt
    10
  • 10
    基于小程序的一次性环保餐具销售系统+springboot+vue.js附带文章和源代码设计说明文档ppt
    8
  • 相关电子书

    更多
  • Flash Player最新安全特性分析 及绕过思路
  • Flash Player最新安全特性分析及绕过思路
  • 面向失败设计
  • 相关实验场景

    更多
  • 1分钟代码漏洞自动检测
  • 下一篇
    2024年阿里云免费云服务器及学生云服务器申请教程参考

    聚圣源曹起名男生名字终身制科技公司起什么名字岫岩起名馆哪里好饭店起的名字免费你长得好像我爸爸gta53dm小孩子起名 五行伊波拉非凡三侠鸭棚子加盟品牌起名打分15188080端口空军雷达学院地址木材企业起名大全餐饮起名网吉姆·罗杰斯书店起名字大全集起名字测试在线外国四大吝啬鬼会计人员信息采集起名字谢氏男宝元月00后起名开店名字如何起起咖啡店的名字优衣库试衣间全视频黄梅时节家家雨的下一句起名常见笔画公司起名吉凶查询淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

    聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化