写给大学生新手的查杀bug方法

2024-02-06 10:08

本文主要是介绍写给大学生新手的查杀bug方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1947年9月9日,九九艳阳天,计算机历史上的第一个bug诞生了,我们之前在古今计算机发展简史(链接)中进行了比较详细的介绍。对于程序员来说,写bug、查bug、杀bug,都是司空见惯的事情。

我博客和公众号的关注者中,有不少是大学生朋友。经常有人给我发一段程序,让我帮找bug在哪里。非工作日且有空的话,我一般会回复:打log调试。仅举三例来看看:

大学生1:

图片

大学生2:

图片

大学生3:

图片

有时候,问题确实比较简单,甚至一眼就可以看出来,但我也不会去直接指出来。授人以鱼不如授人以渔,我更希望他能自己调试出来,并有所进步。比如:

所以,就有了这篇文章。下次再有大学生朋友让你我帮找bug,就把这篇文章给他。顺便说一下,虽然大学生嘴里说大佬,但始终愧不敢当,我有自知之明,跟真正的大佬比,还差得远。

程序调试,是一个极为重要的能力。程序员,写出bug,也基本是见怪不怪了。在不同的场景下,需要用不同的方法来查杀bug.

在实际工作中,经常要用十八般武艺,综合使用或尝试多种方法,才能有效解决问题。客观来说,我自己查杀bug的经验和方法,应该还是比较丰富的。印象最深的是查出了一个linux系统的bug, 后来linux源码更新并发布新版本后,这个bug得到了解决。

图片

然而,对于多数刚学程序的大学生来说,只需要掌握一招简单的方法,就可以搞定几乎所有的问题。方法就是: 打log调试。

我以之前收到的一段代码的简化示例版为例(原程序稍复杂一点):

#include <iostream>
using namespace std;int main()
{int a = 1;int b = 2;int c = 3;int *p = 0;*p = 0;int d = a + b + c;cout << d << endl;return 0;
}

那位大学生的问题是:为什么没有输出d的值,想知道错在哪里?

其实,如果运行这段程序,会有信息提示错在哪一行! 我现在假设他不知道怎么看提示信息,那该如何查问题在哪里呢?答案是:打log调试。如下:

#include <iostream>
using namespace std;int main()
{cout << "xxx1" << endl;int a = 1;cout << "xxx2" << endl;int b = 2;cout << "xxx3" << endl;int c = 3;cout << "xxx4" << endl;int *p = 0;cout << "xxx5" << endl;*p = 0;cout << "xxx6" << endl;int d = a + b + c;cout << "xxx7" << endl;cout << d << endl;cout << "xxx8" << endl;return 0;
}

输出结果是:

xxx1

xxx2

xxx3

xxx4

xxx5

这就奇怪了,有xxx5, 但没有xxx6, 所以错误必然是*p=0这里,这样就找到问题所在了。

总之,对于新手而言,打log调试,查看每一步,是最简单最可行的方法。如果这种方法还解决不了,我再看看是啥变异了的bug.

这篇文章很简单,不值一提,希望对大学生朋友有益。周五了,祝圣诞快乐,周末快乐。早休息!

这篇关于写给大学生新手的查杀bug方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/683969

相关文章

Java捕获ThreadPoolExecutor内部线程异常的四种方法

《Java捕获ThreadPoolExecutor内部线程异常的四种方法》这篇文章主要为大家详细介绍了Java捕获ThreadPoolExecutor内部线程异常的四种方法,文中的示例代码讲解详细,感... 目录方案 1方案 2方案 3方案 4结论方案 1使用 execute + try-catch 记录

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法

《SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法》本文主要介绍了SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法,具有一定的参考价值,感兴趣的可以了解一下... 目录方法1:更改IDE配置方法2:在Eclipse中清理项目方法3:使用Maven命令行在开发Sprin

JAVA SE包装类和泛型详细介绍及说明方法

《JAVASE包装类和泛型详细介绍及说明方法》:本文主要介绍JAVASE包装类和泛型的相关资料,包括基本数据类型与包装类的对应关系,以及装箱和拆箱的概念,并重点讲解了自动装箱和自动拆箱的机制,文... 目录1. 包装类1.1 基本数据类型和对应的包装类1.2 装箱和拆箱1.3 自动装箱和自动拆箱2. 泛型2

C# 委托中 Invoke/BeginInvoke/EndInvoke和DynamicInvoke 方法的区别和联系

《C#委托中Invoke/BeginInvoke/EndInvoke和DynamicInvoke方法的区别和联系》在C#中,委托(Delegate)提供了多种调用方式,包括Invoke、Begi... 目录前言一、 Invoke方法1. 定义2. 特点3. 示例代码二、 BeginInvoke 和 EndI

Python中__new__()方法适应及注意事项详解

《Python中__new__()方法适应及注意事项详解》:本文主要介绍Python中__new__()方法适应及注意事项的相关资料,new()方法是Python中的一个特殊构造方法,用于在创建对... 目录前言基本用法返回值单例模式自定义对象创建注意事项总结前言new() 方法在 python 中是一个

Python依赖库的几种离线安装方法总结

《Python依赖库的几种离线安装方法总结》:本文主要介绍如何在Python中使用pip工具进行依赖库的安装和管理,包括如何导出和导入依赖包列表、如何下载和安装单个或多个库包及其依赖,以及如何指定... 目录前言一、如何copy一个python环境二、如何下载一个包及其依赖并安装三、如何导出requirem

MyBatis与其使用方法示例详解

《MyBatis与其使用方法示例详解》MyBatis是一个支持自定义SQL的持久层框架,通过XML文件实现SQL配置和数据映射,简化了JDBC代码的编写,本文给大家介绍MyBatis与其使用方法讲解,... 目录ORM缺优分析MyBATisMyBatis的工作流程MyBatis的基本使用环境准备MyBati

Nginx中location实现多条件匹配的方法详解

《Nginx中location实现多条件匹配的方法详解》在Nginx中,location指令用于匹配请求的URI,虽然location本身是基于单一匹配规则的,但可以通过多种方式实现多个条件的匹配逻辑... 目录1. 概述2. 实现多条件匹配的方式2.1 使用多个 location 块2.2 使用正则表达式

前端bug调试的方法技巧及常见错误

《前端bug调试的方法技巧及常见错误》:本文主要介绍编程中常见的报错和Bug,以及调试的重要性,调试的基本流程是通过缩小范围来定位问题,并给出了推测法、删除代码法、console调试和debugg... 目录调试基本流程调试方法排查bug的两大技巧如何看控制台报错前端常见错误取值调用报错资源引入错误解析错误