前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实用调试技巧

实用调试技巧

作者头像
see.
发布2024-06-04 12:45:42
700
发布2024-06-04 12:45:42
举报
文章被收录于专栏:C++破军之路C++破军之路

Debug和Release的介绍

Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序

Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。

一个十六进制数字代表四个二进制位,因为2的4次方等于16,所以4个二进制位才能达到表示16的大小。

vs里面的调用堆栈显示的是函数的调用逻辑。

调试的经典案例:1!+2!+3!+……

通过调试我们可以发现在j=3的时候进入循环时,ret的值仍为2,没有置成1,这是导致错误的直接原因。 

调试时要有预期——知道应该是什么结果,调试时发现结果不符合预期就找到问题所在了

如果按正常来说,指针肯定是越界访问了,运行会出现崩溃的现象,但是在这里却出现了死循环,下面我们来一起分析原因:

这是一个经典的调试案例,通过调试我们可以发现,在i=15时,arr[i]被置成了arr[1],在i>10后本来应该报错,但由于后来arr[i]被置成arr[1]代码由此无限运行,陷入死循环,没有报错的机会,可以一直进行循环。

通过分别打印变量i和arr[15]的地址我们发现二者的地址相同。

i和arr是局部变量,局部变量是放在栈区上的,栈区的使用习惯是:先使用高地址,再使用低地址

 数组随着下标的增长,地址是由低到高变化的。

但是如果我们把Debug改为release版本时,代码却可以正常运行,因为release版本对程序进行了优化,release版本把变量i的地址放在了数组地址的下方,这样一来,指针越界也永远越界不到i的地址上,也由此不会发生死循环。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档