编译器的实用调试技巧

news2024/10/7 6:49:04

目录

一. 什么是bug

二.调试的基本步骤

三.Debug和Release

四.常用快捷键 

注意:如果你的快捷键被系统占用,那么可以尝试用:FN+快捷键

F10和F11的区别 :

F5和F9配合使用 

五.如果要观察某个成员

六.断点的使用

F5和F9配合使用 

条件断点 

多个断点的情况

错误案例

原因是栈区分配内存时出现的重复

栈区的分配 

优化的好处


一. 什么是bug

        一个bug的故事:有说法认为,世界上第一个bug出现在1944年,当时的第一台通用自动计算机塔克一号诞生。在一次维护过程中,一位名叫格蕾丝·霍普的女性程序员发现并解决了计算机中的一个缺陷,这个缺陷是由于一只蛾子飞入计算机内部造成的。她使用了发夹将蛾子夹出,并在管理日志上记录了这次事件。此后,“Bug”这个词就被用来指代计算机程序中的错误。

二.调试的基本步骤

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

三.Debug和Release

  1. Debug:是调试版本:它包含调试信息,并且不做任何优化,便于程序员调试
  2. Release:发布版本:它是已经进行过调试和优化,使得程序代码大小和运行速度都是最优的,以便用户使用。测试人员测试的是发布版本。

四.常用快捷键 

注意:如果你的快捷键被系统占用,那么可以尝试用:FN+快捷键

  1. F5 :启动调试用来直接跳到下一个断点处
  2. F9:创建断点,和取消断点
    1. 断点的作用,可以在程序的任意位置添加断点,这样可以使得程序在任意位置停止执行,继而一步步执行下。
  3. F10:逐过程,通常用来处理一个过程,一个过程可以是一个函数调用,或者是一条语句
  4. F11:逐语句,就是每次都执行一条语句,但是这个快捷键,可以使我们执行逻辑进入函数内部(这是最常用的)。
  5. CTRL+F5:开始执行不调试,即不调试直接运行。

F10和F11的区别 :

F10是一次完成一个过程,一次执行一个函数,之间完成函数的内容,不进入函数

F11是逐语句,F11会进入函数一条语句一条语句的执行

F5和F9配合使用 

F9打完断点,会让程序在断电处停止调试,当程序员咋某段代码不想一直调试想一步到位。

可以在那个代码旁边打上断点,然后按F5,让程序一步执行到断点处。

五.如果要观察某个成员

如观察这个arr数组的变化,

首先用        F10执行到这个数组。

然后在调试窗口里找到监视

 可以在监视窗口里检查你想看的内容

六.断点的使用

F5和F9配合使用 

F9打完断点,会让程序在断电处停止调试,当程序员咋某段代码不想一直调试想一步到位。

可以在那个代码旁边打上断点,然后按F5,让程序一步执行到断点处。

条件断点 

如果程序员觉得是在循环中的某一个出现了问题,比如1000次的循环,我们认为是在500次出现了问题,那么我们一个一个循环的去执行太麻烦可以设置条件循环。右击断点,设置条件。

多个断点的情况

如果有多个断点,按F5首先来到第一个断点,注意:再按一次F5不会立刻到下一个断点,而是按F5会 进入循环执行第二次,在按执行第三次等等,直到当前循环逻辑执行完。在次按F5才会直接跳到下一个断点。

 

错误案例

下面这个代码,会出现死循环,按常理来说,越界访问应该是会崩溃的代码,但是我们发现它居然是死循环。

 我们调试发现,i在没有越界的范围时,i是正常++。

 越界之后arr【10】是随机值,正常情况这里应该会报异常错误

 

再次循环访问之后 ,arr居然被赋值为0;

 再次循环到终止条件12,这是我们发现循环变量i,居然由初始化为0,而且我们对循环变量 arr【12】的地址一样。这就会导致i重新进入循环。导致死循环

原因是栈区分配内存时出现的重复

 我们分析代码在栈区,里首先对 Int i =0;分配1个内存地址,然后对数组 arr【】分配10个内存地址。

栈区的分配 

栈区是从高地址低地址分配空间的。

数组是从低地址高地址分配空间的。

所以首先给 循环变量 i 分配空间12,然后给数组arr分配10个空间,然后数组依次向下分配。直到我们越界访问12时 循环变量i 与 arr【12】地址一样,这样我们再次越界访问时就会进入循环。 

由于在vs的编译器下,循环变量 i 的栈区和数组arr【】的战区之间恰好相隔2个空间。

如果是在gcc,i 与 arr之间空1个整型

如果在vc里,i 与 arr 之间没有空隙

 

优化的好处

 如果我们将Debug版本换成Release,之后我们看看优化后的版本。

我们发现Release优化之后,居然没有进入死循环。

我们打印地址之后发现

Release 居然 将 本应该在高地址的循环变量i,和低地址的arr数组,交换了。让 i 去了低地址,arr去了高地址。这样就arr无论越界多少次,都不会和循环变量i重叠。 

 

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

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

相关文章

【Gephi项目实战-带数据集】利用gephi绘制微博肖战超话120位用户关系图,并计算整体网络指标与节点指标

数据集在评论区,B站演示视频在评论区! 简介 最近2天需要用到gephi做社会网络分析,于是从0开始接触gephi并摸索出了gephi的基本使用指南。下面将结合真实的节点文件与边文件,利用gephi绘制社会网络并计算相关测量指标。整个过程会…

BC1.2 SDP/CDP/DCP介绍

参考:文章链接 Microchip Lightning Support 问题 Q1.) 在Microchip产品的数据表中提到了电池充电技术,但以下术语是什么意思: BC1.2? SDP? CDP? DCP? “SE1”? Q2.) 如何配置Microchip Hub以启用这些功能? Q3.) 如何在我的硬件上物…

Profinet转CANopen主站网关与堡盟编码器通讯案例

Profinet转CANopen主站网关(XD-COPNm20)为CPU与堡盟编码器的通讯提供了CANopen协议向Profinet协议转换互通的桥梁。CANopen是一种基于CAN总线的通讯协议,它被广泛应用于工业自动化领域,而Profinet是一种以太网协议,其优点是高速传输和广泛的可…

python-题库篇-数学

文章目录 求最大公约数和最小公倍数斐波那契数列求和运算求前n阶乘的和求年龄 求最大公约数和最小公倍数 两个数的最大公约数是两个数的公共因子中最大的那个数;两个数的最小公倍数 则是能够同时被两个数整除的最小的那个数。 输入:(120 和…

Vue-easy-tree封装及使用

1.使用及安装 下载依赖 npm install wchbrad/vue-easy-tree引入俩种方案 1.在main.js中引入 import VueEasyTree from "wchbrad/vue-easy-tree"; import "wchbrad/vue-easy-tree/src/assets/index.scss" Vue.use(VueEasyTree)2.当前页面引入 import VueEa…

红队渗透靶机:LORD OF THE ROOT: 1.0.1

目录 信息收集 1、arp 2、nmap 3、knock 4、nikto 目录探测 1、gobuster 2、dirsearch WEB sqlmap 爆库 爆表 爆列 爆字段 hydra爆破 ssh登录 提权 信息收集 内核提权 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface: eth0, ty…

Redis(三)主从架构、Redis哨兵架构、Redis集群方案对比、Redis高可用集群搭建、Redis高可用集群之水平扩展

转自 极客时间 Redis主从架构 redis主从架构搭建,配置从节点步骤: 1、复制一份redis.conf文件2、将相关配置修改为如下值: port 6380 pidfile /var/run/redis_6380.pid # 把pid进程号写入pidfile配置的文件 logfile "6380.log" …

使用代理IP有风险吗?如何安全使用代理IP?

代理IP用途无处不在。它们允许您隐藏真实IP地址,从而实现匿名性和隐私保护。这对于保护个人信息、绕过地理受限的内容或访问特定网站都至关重要。 然而,正如任何技术工具一样,代理IP地址也伴随着潜在的风险和威胁。不法分子可能会滥用代理IP…

【计算机学院寒假社会实践】——走进社区,共建美好家园

为了加强社区基层党组织建设和改进社区工作,推动更多资源向社区倾斜,曲阜师范大学计算机学院“青年扎根基层,服务走进社区”实践队员饶子恒在2024年1月27日来到了山东省菏泽市郓城县唐塔社区,对社区卫生进行清洁工作。 图为实践队…

pdf高亮显示

现在前端pdf需求越来越多,比如发票的显示,文件的显示,怎么实现具体步骤百度一下吧,这里不做详细介绍,主要记录下遇到的问题 1.页面pdf已经看到了,但是 iframe.contentWindow.PDFViewerApplication显示unde…

Python中的while循环,知其然知其所以然

文章目录 while循环结构1.用循环打印1 ~ 100步骤解析2. 1 ~ 100的累加和3.死循环1. 用死循环的方法实现 1 ~ 100累加和 4. 单向循环(1)打印 一行十个小星星*(2)通过打印一个变量的形式,展现一行十个小星星(3)一行十个换色的星星 ★☆★☆★☆★☆★☆(4)用一个循环,打印十行十列…

JAVA中的object类

一、equals方法 1.和equals的比较 既可以判断基本类型有可以判断引用类型 如果判断基本类型,判断的值是否相等 int num1 10; double num2 10.0; System.out.println(num1 num2); 如果判断引用类型,判断的地址是否相等,即判断是不是同一…

【教程】一个比较良心的C++代码混淆器

这是一个比较良心的C代码混淆器,用于信息竞赛训练和保护代码免受抄袭。本文将介绍这个混淆器的使用方法、混淆效果和已知的一些bug。同时,我们也会给出一些示例来演示混淆器的具体操作。 引言 在信息竞赛训练和实际开发中,保护代码的安全性和…

HomeAssistant系统添加HACS插件商店与远程控制家中智能家居

文章目录 基本条件一、下载HACS源码二、添加HACS集成三、绑定米家设备 ​ 上文介绍了如何实现群晖Docker部署HomeAssistant,通过内网穿透在户外控制家庭中枢。本文将介绍如何安装HACS插件商店,将米家,果家设备接入 Home Assistant。 基本条件…

leetcode(滑动窗口)3.无重复字符的最长字串(C++详细题解)DAY2

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示…

基于Vue2用keydown、keyup事件实现长按键盘任意键(或组合键)3秒触发自定义事件(以F1键为例)

核心代码 <template></template> <script> export default {created() {//监听长按快捷键addEventListener("keydown", this.keydown);addEventListener("keyup", this.keyup);},destroyed(d) {//移除长按快捷键removeEventListener(&…

基于抖音小程序实现的答题小程序

看过《一站到底》后&#xff0c;不仅学到了很多新知识&#xff0c;还感受到了选手们的聪明才智和对知识的热爱。同时&#xff0c;也意识到自己的知识储备还有很大的提升空间&#xff0c;因此我会继续努力学习&#xff0c;提高自己的知识水平。 《一站到底》是一档益智答题类节…

Leetcode刷题笔记题解(C++):1863. 找出所有子集的异或总和再求和

思路如下&#xff1a;递归思路&#xff0c;依次遍历数组中的数&#xff0c;当前数要不要选择像二叉树一样去遍历如下图所示 0 0 &#xff08;选5&#xff09; 5&#xff08;不选5&#xff09; 0 1 0 1 0 6 …

[word] 怎么删除文字底纹 #职场发展#其他

怎么删除文字底纹 怎么删除文字底纹?我们在录入文字到文档的时候&#xff0c;或者是复制网上内容时&#xff0c;都会带有格式&#xff0c;有时候还会遇到删除不掉的问题。今天给大家分享小技巧&#xff0c;解决你的问题。 1、删除文字底纹 文档自带的底纹&#xff0c;删除技…

Mysql连接编译踩坑问题

复习下mysql基本命令 登录mysql mysql #没密码登录 mysql -u root -p #以用户名root 需要交互输入密码方式登录显示所有数据库 SHOW DATABASES&#xff1b; 使用某个数据库 use database_name; 查看当前数据库某一张表的表结构 DESCRIBE table_name; 解决一个mysql 用…