程序的调试

一名优秀的程序员也是一名出色的侦探,每一次调试都是尝试破案的过程

目录

前言

一、什么是调试?

二、调试

1.调试是什么

2.基本步骤

三、调试注意事项 

1.怎么写出易于调试的代码

 assert(断言)

const

2.常见错误

总结


前言

主要是怎么调试,调试的注意事项,调试中常见的错误和遇到的问题


一、什么是调试?

第一次发现导致计算机错误的飞鹅:bug 英语单词“昆虫”的意思

二、调试

1.调试是什么

找代码里面问题的过程

一切发生的事都有迹可循

迹象越多越容易顺滕而上 (推理)

调试就是发现并减少计算机程序中的错误


2.基本步骤

发现程序错误的存在

以隔离,消除等方法对错误进行定位

确定错误产生原因

提出纠正错误的解决办法

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

基本选项了解:

debug调试

release发布版本(编译器自动优化)

IDE--集成开发环境

F5启动调试

F11逐语句(可以进入函数内部 细节)

F10逐过程

F9创建短点和取消断点(在多行程序或多文件适用),可以在程序任意位置设置断点

control+f5开始执行不调试


三、调试注意事项 

调试的时候查看程序信息

一定要先开始调试,才能看到监视窗口!

观察内存:调试>窗口>内存

指针变量的内容和地址是不一样的,指针指向一个常量或变量,指针自己也占一个空间,有自己的地址,空间里的内容是所指常量或变量的地址

如下例:

?是随机值


反汇编能看到程序翻译成的汇编代码

查看临时变量:调试时会自动更新变量的值,使用起来不是很友好

查看调用堆栈

补充知识点:

数据结构中:

队:排队,后进前出

栈:栈帧,一堆,上进上出,(汉诺塔)


栈区:局部变量

堆区

静态区

栈区的使用习惯是先使用高地址处空间


1.怎么写出易于调试的代码

代码运行正常

bug少

效率高

可读性高

可维护性高

注释清晰

文档齐全

常见的coding技巧

使用assert(断言)<assert.h>

尽量使用const

养成良好的代码风格

添加必要注释

避免编码陷阱

 assert(断言)

assert中可以放一个表达式,表达式的结果为假就报错,反之则不发生状况。可以利用assert来检测程序中的bug,如检测指针p的值是不是为null,但只能在debug环境下使用,在release中assert的报错会被自动优化。

const

const修饰一个变量时,变量被保护,不能再修改变量的值

const修饰指针时

放在*的左边,修饰指针变量指向的内容,表示指向指针的内容不能通过指针来改变了;但指针变量本身可以修改

const int *p=#

*p=10;//err

p=&n;//ok

放在*右边,修饰指针变量本身,表示指针变量本身不能被修改;但是指针指向的内容可以通过指针来改变

 int * const p=#

*p=10;/ok

p=&n;//err

2.常见错误

编译错误:直接有错误提示信息

链接错误:无法解析的外部符号

运行错误:能够调试的都是运行错误

总结

(未完待续....)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/63935.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FPGA实现GTP光口数据回环传输,基于Aurora 8b/10b编解码架构,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目我这里已有的 GT 高速接口解决方案 3、工程详细设计方案工程设计原理框图用户数据发送模块基于GTP高速接口的数据回环传输架构GTP IP 简介GTP 基本结构GTP 发送和接收…

如何快速切换更新电脑网络的ip地址

1.ADSL拨号更换IP地址 这种更换 IP地址的方法其实就是我们平时使用的宽带拨号,每次拨号得到的IP地址都不同,但是这种方法无法使用于光纤宽带,并且使用这种方法更换的IP地址,一般只会变更最后一个号段,前三个号段的数字…

25.DDD数量关系

学习视频来源:DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 关系型数据库的数量关系领域模型的数量关系实现聚合数量关系聚合内聚合间具体说明代码 数量关系是本质吗?领域对象之…

每天40分玩转Django:Django视图和URL

Django视图和URL 一、课程概述 学习项目具体内容预计用时视图基础函数视图、类视图、视图装饰器90分钟URL配置URL模式、路由系统、命名URL60分钟请求处理请求对象、响应对象、中间件90分钟 二、视图基础 2.1 函数视图 # blog/views.py from django.shortcuts import render…

SAS - Subtractive Port

在SAS(串行连接SCSI,Serial Attached SCSI)协议中,subtractive port 是一种特殊类型的端口,主要用于设备间的路由功能。它的作用是在路径选择过程中充当默认路径,以处理未明确指定路径的请求。以下是它的定…

vue实现文件流形式的导出下载

文章目录 Vue 项目中下载返回的文件流操作步骤一、使用 Axios 请求文件流数据二、设置响应类型为 ‘blob’三、创建下载链接并触发下载四、在 Vue 组件中集成下载功能五、解释与实例说明1、使用 Axios 请求文件流数据:设置响应类型为 blob:创建下载链接并…

用Keytool和OpenSSL生成和签发数字证书

一)keytool生成私钥文件(.key)和签名请求文件(.csr),openssl签发数字证书 J2SDK在目录%JAVA_HOME%/bin提供了密钥库管理工具Keytool,用于管理密钥、证书和证书链。Keytool工具的命令在JavaSE6中已经改变,不过以前的命令仍然支持。Keytool也可以用来管理对称加密算法中…

语言模型(序列模型)

终于快要毕业了,乘着还在还在研究室,把最后一章sequence模型也学完吧。 Sequence Model 一:基础知识1:符号的定义2:词典(Vocabulary) 与编码(Encoding) 二:RNN(Recurrent Neural Networks) 循环神经网络1&…

RK3568(六)——led设备驱动(GPIO子系统)

修改设备树文件 先关闭心跳灯功能,也就是在图 10.4.1.2 中第 167 行添加 status 改为 disabled,也就是禁止 work 这个节点,那么禁止心跳灯功能。 我们后面需要禁止哪个功能,只需要将其 status 属性改为 disabled 就可以了。 gpi…

【自然语言处理与大模型】使用llama.cpp将HF格式大模型转换为GGUF格式

llama.cpp的主要目标是在本地和云端的各种硬件上以最小的设置和最先进的性能实现LLM推理。是一个专为大型语言模型(LLM)设计的高性能推理框架,完全使用C和C编写,没有外部依赖,这使得它可以很容易地被移植到不同的操作系…

npm : 无法加载文件 D:\nodejs\npm.ps1

问题描述 npm run serve 启动一个Vue项目,报错如下: npm : 无法加载文件 D:\nodejs\npm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/? LinkID135170 中的 about_Execution_Policies。…

【算法】EWMA指数加权移动平均绘制平滑曲线

EWMA(Exponentially Weighted Moving Average,指数加权移动平均)是一种常用的时间序列平滑技术,特别适用于对过去数据给予不同的权重。以下是对EWMA算法的详细介绍: 一、核心思想 EWMA算法的核心思想是通过指数衰减来…

UAC2.0 speaker——带反馈端点的 USB speaker(16bit 单声道)

UAC2.0 speaker 系列文章 UAC2.0 speaker——单声道 USB speaker(16bit) UAC2.0 speaker——类特殊请求 UAC2.0 speaker——音量控制 UAC2.0 speaker——多采样率支持 UAC2.0 speaker——24/32bit 支持 UAC2.0 speaker——speaker 数据传输 UAC2.0 speaker——同时支持 16bi…

智星云技术文档:GPU测速教程

安装gpu burn git clone https://github.com/wilicc/gpu-burn cd gpu-burn/ make测试 ./gpu_burn 60100.0% procd: 14280 (7373 Gflop/s) - 13390 (6997 Gflop/s) - 15912 (7110 Gflop/s) - 13184 (7055 Gflop/s) - 13464 (7369 Gflop/s) - 13974 (7351 Gflop/s) - 16626 (7…

Python工厂设计模式:简化对象创建

Python工厂设计模式:简化对象创建 引言什么是工厂模式?简单工厂模式示例定义基类和子类创建工厂类使用工厂创建对象 优点使用场景总结 引言 在编程中,我们经常需要创建不同的对象,但有时创建对象的逻辑可能会变得复杂。工厂设计模…

线程池+线程安全+常见锁

目录 一、线程池1、日志与策略模式2、线程池设计3、线程安全的单例模式(1)单例模式的特点(2)饿汉实现方式和懒汉实现方式(i)饿汉方式实现单例模式(ii)懒汉方式实现单例模式&#xff…

数据结构6.4——归并排序

基本思想: 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个…

vue3+element-plus导航栏定位

一、父组件代码&#xff1a; <template> <div v-loading"loading" class"stock-detail" scroll"handleScroll"> <!-- tab导航栏 --> <navList :tabActive"activeIndex" :tabList"tabList" :tabStyle&…

数仓高频面试 | 数仓为什么要分层

大家好&#xff0c;我是大D呀。 关于数仓分层&#xff0c;在面试过程中几乎是必问的。不过&#xff0c;面试官一般也不会直接考你数仓为什么要分层&#xff0c;而是在你介绍项目时&#xff0c;可能会换一种形式来穿插着问&#xff0c;比如数据链路为什么要这样设计&#xff0c…

revit转gltf,revit转3dtiles,如何将Revit模型转为3DTiles格式并在Cesiumjs中高效可视化

Revit模型导出gltf、glb与3dtiles有多种方式&#xff0c;但一般的商业工具收费普遍较高&#xff1a;Cesiumlab导出3dTile格式数据&#xff0c;Cesiumlab暂时可试用3天&#xff0c;会员版收费每年800&#xff1b;BimAngleEngine导出3dTile格式数据BimAngleEngine暂时可试用30天&…