常用的调试技巧(如何检测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

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

相关文章
|
11月前
|
运维 安全 Linux
优雅告别系统(Linux用户退出脚本全解析)
本文教你如何编写Linux用户退出脚本,确保安全退出会话、清理资源并记录日志。涵盖基础命令(exit/logout)、脚本编写、自动触发与最佳实践,适合新手和运维人员提升系统安全性。
|
9月前
|
SQL 安全 数据库
从零理解SQL注入:原理、案例与防御
从零理解SQL注入:原理、案例与防御
474 139
|
11月前
|
传感器 供应链 监控
1688商家必看:如何高效转化精准流量?四大核心策略深度解析
本文针对1688平台B2B商家流量转化难题,提出四大核心策略:优化商品基础提升信任、科学关联销售提高客单价、构建专业客服体系促进成交、打造差异化价值突破同质竞争。通过系统化运营与数据驱动,助力商家实现从“有流量”到“能成交”的高效转化闭环。
|
9月前
|
应用服务中间件 nginx 开发者
Logoly:几秒钟做出「P站 风格」Logo 的开源小工具
Logoly 是一款开源在线 Logo 生成工具,主打 P站/OnlyFans 风格设计,无需设计基础,改文字、调颜色几秒生成趣味 Logo,支持导出 PNG/SVG,适合做头像、PPT 彩蛋或梗图,开箱即用,开发者还可本地部署。
2111 3
|
算法
数据结构中的KMP算法及其改进算法
KMP算法通过引入部分匹配表,有效避免了重复计算,从而将字符串匹配的时间复杂度降低到O(m+n)。通过进一步优化next数组,KMP算法的效率得到了进一步提升。对于大规模字符串匹配问题,KMP算法及其改进算法提供了高效的解决方案,是计算机科学领域的经典算法之一。
1176 3
|
Java UED 开发者
Spring Boot 降级功能的神秘面纱:Hystrix 与 Resilience4j 究竟藏着怎样的秘密?
【8月更文挑战第29天】在分布式系统中,服务稳定性至关重要。为应对故障,Spring Boot 提供了 Hystrix 和 Resilience4j 两种降级工具。Hystrix 作为 Netflix 的容错框架,通过隔离依赖、控制并发及降级机制增强系统稳定性;Resilience4j 则是一个轻量级库,提供丰富的降级策略。两者均可有效提升系统可靠性,具体选择取决于需求与场景。在面对服务故障时,合理运用这些工具能确保系统基本功能正常运作,优化用户体验。以上简介包括了两个工具的简单示例代码,帮助开发者更好地理解和应用。
699 0
|
数据采集 机器学习/深度学习 人工智能
代理IP:企业AI应用的隐形加速器与合规绞索
代理IP作为企业AI应用的重要基础设施,既是效率提升的加速器,也可能成为合规风险的来源。它通过技术演进重塑数据采集、模型训练与安全防护等核心环节,如智能路由、量子加密和边缘计算等创新方案显著优化性能。然而,全球法规(如GDPR)对数据流动提出严格要求,促使企业开发自动化合规审计系统应对挑战。未来,代理IP将向智能路由3.0、PaaS服务及量子网络方向发展,成为连接物理与数字世界的神经网络。企业在享受其带来的效率增益同时,需构建技术、法律与伦理三位一体的防护体系以规避风险。
393 0
|
安全 搜索推荐 网络安全
HTTPS与HTTP:区别及安全性对比
HTTP和HTTPS是现代网络通信中的两种重要协议。HTTP为明文传输,简单但不安全;HTTPS基于HTTP并通过SSL/TLS加密,确保数据安全性和完整性,防止劫持和篡改。HTTPS还提供身份验证,保护用户隐私并防止中间人攻击。尽管HTTPS有额外的性能开销和配置成本,但在涉及敏感信息的场景中,如在线支付和用户登录,其安全性优势至关重要。搜索引擎也更青睐HTTPS网站,有助于提升SEO排名。综上,HTTPS已成为大多数网站的必然选择,以保障用户数据安全和合规性。
3865 1
|
机器学习/深度学习 存储 算法
如何利用Transformer建立时间序列预测模型
如何利用Transformer建立时间序列预测模型
3073 0
如何利用Transformer建立时间序列预测模型
|
数据安全/隐私保护 iOS开发 MacOS
如何删除macOS用户
当常规方式无法删除用户时,可通过终端命令删除。使用 `sudo dscl` 和 `sudo rm -rf` 删除用户账户及目录。若遇 eDS 权限错误,需通过 `sysadminctl` 开启 Secure Token。普通用户需重置密码并赋予管理员权限后方可删除。详见操作步骤及错误解决方案。

热门文章

最新文章