当前位置: 首页 > news >正文

网站域名跳转怎么弄好消息tvapp电视版

网站域名跳转怎么弄,好消息tvapp电视版,微信学校网站模板,做网站公司青浦目录 1、问题描述 2、访问空指针或者野指针 3、常见的异常值 4、0xdddddddd内存访问违例问题分析与排查 5、关于0xcdcdcdcd和0xfeeefeee异常值的排查案例 6、最后 VC常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)ht…

目录

1、问题描述

2、访问空指针或者野指针

3、常见的异常值

4、0xdddddddd内存访问违例问题分析与排查

5、关于0xcdcdcdcd和0xfeeefeee异常值的排查案例

6、最后


VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125529931C++软件分析工具从入门到精通案例集锦(专栏文章正在更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/131405795C/C++基础与进阶(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_11931267.html       在C++软件中访问了有问题的指针变量,可能会引发程序产生异常,比如访问了空指针和野指针,这也是操作指针错误最常见的原因。今天我们就来讲一个操作已经释放内存的野指针实例,本例中的问题指针有些特殊,释放内存后指针值变为0xdddddddd,和以往常见的异常值0xfeeefeee有所不同。本文将详细讲述一下这个问题的完整分析过程,以供大家借鉴或参考。

1、问题描述

       某天在开发新功能,使用Visual Studio在Debug下调试代码,执行某一操作后程序就产生了异常,Visual  Studio中断了下来,调到了发生异常的代码处,显示代码处的指针m_pRoot值为0xdddddddd,如下所示:

此处是发生了崩溃。这行代码使用m_pRoot指针调用FindControl接口,由于FindControl是虚函数,调用时会触发虚函数调用时的二次寻址,会去访问m_pRoot中存放的内存首地址0xddddddddd,而对于32位程序,这个地址属于内核态的内存地址,用户态的代码是禁止访问的,所以触发了内存访问违例,产生了异常。

对于32程序,系统会给程序进程分配4GB的虚拟内存,其中0-2GB是用户态的内存,2GB-4GB是内核态的内存,用户态的代码不能访问内核态的内存,内核态的代码也不能访问用户态的内存。强行访问,就会触发内存访问违例,引发程序崩溃。

2、访问空指针或者野指针

       在操作指针时最常见的问题就是访问了空指针和野指针。操作这两类指针产生异常,均是因为使用指针去访问了指向类的数据成员,访问了不该访问的内存地址,引发内存访问违例。对于空指针,在使用空指针访问了类对象的数据成员,就会访问很小的内存地址,小于64KB地址值的内存区域是禁止访问的。

       产生野指针,主要有两个场景:

1)Release下没有对指针变量进行初始化,指针变量的值是个随机值,是分配内存时内存中残留的随机值,此时的指针就是野指针。
2)指针指向的内存被释放了,但指针没有置为NULL,此时的指针也是野指针。

       通过野指针中的值去访问指向类的数据成员,可能会触发访问不该访问的内存地址,触发内存访问违例,引发崩溃。 

3、常见的异常值

        C++程序中常见的异常值如下所示(异常值不区分大小写,比如0xcdcdcdcd也可以写成0xCDCDCDCD):

* 0xcccccccc:Used by  Microsoft's C++ debugging runtime library and many DOS environments to mark uninitialized stack memory.CC resembles the opcode of the  INT 3 debug breakpoint interrupt on x86 processors.
* 0xcdcdcdcd:Used by  Microsoft's C/C++ debug malloc() function to mark uninitialized heap memory, usually returned from HeapAlloc().
* 0xfeeefeee:Used by  Microsoft's debug HeapFree() to mark freed heap memory. Some nearby internal bookkeeping values may have the high word set to FEEE as well.
* 0xdddddddd:Used by MicroQuill's SmartHeap and Microsoft's C/C++ debug free() function to mark freed heap memory.
* 0xabababab:Used by Microsoft's HeapAlloc() to mark "no man's land" guard bytes after allocated heap memory.
* 0xabadcafe:A startup to this value to initialize all free memory to catch errant pointers.
* 0xbaadf00d:Used by Microsoft's LocalAlloc(LMEM_FIXED) to mark uninitialised allocated heap memory.
* 0xbadcab1e:Error Code returned to the Microsoft eVC debugger when connection is severed to the debugger.
* 0xbeefcace:Used by Microsoft .NET as a magic number in resource files.

主要关注0xcccccccc、0xcdcdcdcd、0xfeeefeee和0xdddddddd这四个异常值。这几异常值是Debug下默认设置的,0xcccccccc用来初始化未初始化的栈内存,0xcdcdcdcd用来初始化未初始化的堆内存,0xfeeefeee用来填充已经释放的堆内存,0xdddddddd也是用来填充已经释放的堆内存。

       我们需要对这些异常值有较强的敏感度,如果在调试代码中遇到这些异常值,可以明显的提示我们当前访问的内存大概出了什么问题。这样我们排查时就有了一定的方向。

0xfeeefeee和0xdddddddd都是用来填充已经释放的堆内存区域,但不太清楚这两个异常值的区别。我们经常在调试代码遇到0xfeeefeee,基本没遇到过0xdddddddd,本案例还是第一次遇到0xdddddddd。

4、0xdddddddd内存访问违例问题分析与排查

       根据异常中断时的弹窗提示,当前的m_pRoot指针值为0xdddddddd,通过这个异常值的含义大概知道可能是访问了已经释放内存的野指针引发的。

其实最开始看到0xdddddddd异常值,并不知道其含义,因为以前遇到访问已经释放内存的场景都是出现0xfeeefeee这个异常值,从来没见过0xdddddddd,这还是第一次遇到。后来到网上查了才知道,0xdddddddd也是Debug下用来填充已经释放的内存区域的。

       0xdddddddd异常值提示我们程序中访问了已经释放的内存区域,那我们只要去分析这块内存是何时释放的,结合当前访问的代码,大概就知道原因了。但因为当前的代码逻辑比较复杂,且相关模块不是我维护的,直接去排查可能会比较费劲。

       根据Visual Studio中断的代码位置:

结合当时的函数的调用堆栈,当时对应的类为CSmallVideoWndUI,所以要排查这个必现的问题有个很好的办法,在CSmallVideoWndUI的析构函数设置断点

一旦有delete CSmallVideoWndUI类对象时就会进入析构函数,就会命中断点,这样查看函数调用堆栈就知道是何处将CSmallVideoWndUI对象delete了。

       但还有个问题,很多代码都使用了该类,代码中会频繁的new和delete CSmallVideoWndUI类对象,所以直接在CSmallVideoWndUI析构函数中打断点,可能会多次命中断点,这样就不好确定哪次析构是和当前的问题相关的。所以还要再设置一个断点,这个异常崩溃是执行鼠标双击操作引发的,我们可以在双击消息的响应函数中先设置一个断点:

当命中该断点后,再到CSmallVideoWndUI类的析构函数中设置断点,这样命中CSmallVideoWndUI析构函数断点时可能就和本问题有关了。

       使用上述调试方法,很快找到了问题代码,解决了问题。

5、关于0xcdcdcdcd和0xfeeefeee异常值的排查案例

       关于常见异常值0xcdcdcdcd和0xfeeefeee的排查案例,可以参见我之前写的文章:
0xcdcdcdcd异常值引发C++程序崩溃问题的详细分析icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/128380751排查软件启动时访问了0xcdcdcdcd内存地址导致内存访问违例的崩溃icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125266735排查软件关闭时访问了0xfeeefeee内存地址导致内存访问违例的崩溃icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125267046

6、最后

       大家在调试代码要提高对0xcccccccc、0xcdcdcdcd、0xfeeefeee和0xdddddddd等常见异常值的敏感度,看到这些异常值就能大概地估计是什么原因导致的,这样我们就有了问题排查的方向。此外,在设置断点也要有一定的技巧,比如使用数据断点监测内存越界问题人为添加if条件语句构造“条件”断点在命中一个断点后再设置后续断点等等。

http://www.rdtb.cn/news/13215.html

相关文章:

  • 企业vi设计公司价格搜索引擎优化的核心及内容
  • 长沙百度快速优化排名厦门关键词优化企业
  • 佛山网站建设设计网站流量统计分析
  • 网站首页在哪个文件夹站长工具域名
  • 常用的电子商务网站开发技术足球比赛直播2021欧冠决赛
  • 免费做期中考试的网站网站优化关键词排名公司
  • 做网站seo赚钱吗百度权重排名查询
  • 网站开发的工作流程百度竞价托管运营
  • 腾讯云建设网站uc推广登录入口
  • 新手如何给自己的网站做优化福州网站关键词推广
  • 北京做网站源代码的自己怎么开电商平台
  • 上海比较好的公司排名网站seo诊断分析
  • 柳州旅游网站建设简述如何对网站进行推广
  • 网站开发合同违约责任上海网站建设公司
  • wordpress网站排行榜100个商业经典案例
  • 织梦装修设计网站模板百度的相关搜索
  • 网页设计与制作教程第六版百度关键词seo外包
  • 织梦dedecms电影网站模板正版google下载
  • wordpress argo专业seo关键词优化
  • 做网站销售好做吗百度seo引流
  • 自己做的网站二维码怎么做的品牌推广和品牌营销
  • 假网站怎么做seo日常工作内容
  • 离退休党建设工作网站360免费建站网页链接
  • 网站主页面设计全球搜是什么公司
  • 做投票的网站赚钱嘛成都网络推广运营公司
  • 山海关网站制作广东疫情最新数据
  • 松北区建设局网站谷歌搜索引擎镜像
  • 星巴克网站建设网络营销的传播手段
  • 学校网站建设文字规范问题旅行网站排名
  • 做网站就是做点击率seo推广宣传