博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
VS 0xC0000005 运行错误分析
阅读量:7187 次
发布时间:2019-06-29

本文共 1128 字,大约阅读时间需要 3 分钟。

0xC0000005: 读取位置 0x22203A22 时发生访问冲突

场景

   网络传输过来的,由于采用了qpid-cpp库,获取到的是request.getContent()的是string类型的数据类型,然后通过c_str函数,获取到字符串,保存在一个char szBuffer[1024]数组内,在定义的类,调用析构函数退出导致程序崩溃

原因

    通过strcpy拷贝字符串到szBuffer数组,发生了数组的越界,因为字符串的长度是1159

提醒

    目前已经出现过两次的0xC0000005崩溃信息

1 访问一个释放的空指针,在一个递归的逻辑中

2 strcpy拷贝字符串,发生数组越界

xC0000005:读取位置oxfeeefeee时发生访问冲突

问题

    test.exe 中的 0x1021af50 (zlib.dll) 处未处理的异常: 0xC0000005: 读取位置 0xfeeefeee 时发生访问冲突

    

分析

    代码中断于获取list的迭代指针:

 #if _HAS_ITERATOR_DEBUGGING || _SECURE_SCL

iterator begin()

{// return iterator for beginning of mutable sequence

return (iterator(_Nextnode(_Myhead), this));

}

怀疑1:是否是堆栈溢出?不可能没有占用多少空间

怀疑2:是否迭代书写问题?不可能在其他的程序运行良好

现象:调用堆栈的显示区域,提示:feeefeee()

进行debug设置:调试菜单下,勾选所有的异常,在调试的模式下,重新编译。这一次指向list迭代之前的一行代码,这行代码进行了字符串的拷贝,观察赋值指针,pszName的值是0xfeeefeee:错误的指针。

补充知识

FEEEFEEE微软的HeapFree函数用该值来标记被释放了的堆内存

经过上面的知识,可以知道任何的一块内存分配,都会在字符串中填充0xfeeefeee作为内存没有释放的标志,当调用函数释放内存的时候,就会首先检查指针的内容是否包含该标志位,如果没有该标志位,就会出现异常中断的情况。pszName分配的内存已经被释放,导致了程序中断。在项目中,采用了递归的算法进行了多次的搜索,在函数进行退出递归的时候,该指针已经指向了一个已经释放的内存,所在在进行递归的过程中,将已有的内容拷贝出来,防止在递归的过程中被释放,从而解决了问题。

     本文转自fengyuzaitu 51CTO博客,原文链接:http://blog.51cto.com/fengyuzaitu/1959204,如需转载请自行联系原作者

你可能感兴趣的文章
Mesos:服务发现与负载均衡
查看>>
Cisco ASA SSL××× configturation
查看>>
《你的灯亮着么》每年读一次--摘句
查看>>
单例的实现方式
查看>>
配置本地host,实现本地域名解析设置
查看>>
js总结
查看>>
川藏线大全-川藏线南线好还是北线好
查看>>
我的友情链接
查看>>
Apache服务器配置技巧
查看>>
Ecshop:后台添加新功能栏目以及管理权限设置
查看>>
js中call与apply用法
查看>>
HTML入门
查看>>
IIS 7.5 配置伪静态
查看>>
Oracle 11G搭建单实例Active DataGuard
查看>>
整理的Android开发资源
查看>>
测试,请忽略
查看>>
打印html页面出现空白段落问题
查看>>
我的友情链接
查看>>
用按位或解决问题
查看>>
内网地址的网段
查看>>