注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

mie

 
 
 

日志

 
 

【原】“发生访问冲突”问题的一般解决方法:**.exe 中的 0x4aee65a7 处最可能的异常: 0xC0000005: 写入位置 0x067f3013 时发生访问冲突  

2010-11-04 17:03:24|  分类: 疑难杂症 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

        最近的程序中一直出现“**.exe 中的 0x4aee65a7 处最可能的异常: 0xC0000005: 写入位置 0x067f3013 时发生访问冲突”这类错误。对于这种问题,一直没能找到好的解决方法,在网上也没能找到答案。这次特地抽出时间来好好分析了一下。

        数据断点。我起初以为,对0x4aee65a7下数据断点,或许有效。但是没有效果。确实,如果是数据断点,应该是下在0x067f3013 地址。

        函数断点。于是,我对0x4aee65a7下函数断点,很快,程序中断了!函数调用栈如下:

  GdiPlus.dll!4aee65a7()  
  [下面的框架可能不正确和/或缺失,没有为 GdiPlus.dll 加载符号] 
  GdiPlus.dll!4aee6723()  
  GdiPlus.dll!4aee6d23()  
  GdiPlus.dll!4aefb80c()  
  GdiPlus.dll!4aefbcab()  
  GdiPlus.dll!4aefb6cc()  
  GdiPlus.dll!4aefbde0()  
  GdiPlus.dll!4aea05c7()  
  GdiPlus.dll!4aefb497()  
  **.exe!Gdiplus::Image::SelectActiveFrame(const _GUID * dimensionID=0x0737f53c, unsigned int frameIndex=11)  行384 + 0x14 字节 C++
> **.exe!CSkinDrawer::DrawPictureNode(CSkinNode::_PICTURE_TYPE type=PICTURE_TYPE_GIF, HBITMAP__ * hbitmap=0x00000000, Gdiplus::Graphics * graphics=0x03547900, tagRECT * lprect=0x0737f718, unsigned long color=16053492, unsigned char transparent=225, CSkinNode::_PICTURE_DRAW_TYPE draw_type=PICTURE_DRAW_TYPE_STRETCH, CSkinNode::_PICTURE_DRAW_TILE_TYPE tile_type=PICTURE_DRAW_TILE_TYPE_TILE, CSkinNode::_PICTURE_DRAW_TRUESIZE_X_TYPE true_x_type=PICTURE_DRAW_TRUESIZE_X_TYPE_LEFT, CSkinNode::_PICTURE_DRAW_TRUESIZE_Y_TYPE true_y_type=PICTURE_DRAW_TRUESIZE_Y_TYPE_TOP, _MARGINS * pnine_grid_margins=0x06af9ac0, _MARGINS * pmargins=0x06af9ad4, const wchar_t * gif_file=0x001e5100, unsigned int * gif_frame=0x06af9af4, unsigned int * gif_frame_count=0x06af9af8, Gdiplus::Image * * gif_image=0x06af9aec)  行1073 + 0x14 字节 C++

 

这个DrawPictureNode函数的参数比较多,十几个,可以不看的。
   GUID pageGuid = FrameDimensionTime;
   if ((*gif_image)->SelectActiveFrame(&pageGuid, (*gif_frame))==Ok)        //问题出在这儿
   {
    ret=DrawBitmap(*gif_image, graphics,...);
   }

也就是说,在调用GDI+的Image::SelectActiveFrame函数时,出现共享违例了。

 

        至此,我们通过简单地下一个函数断点,找到了这类问题的病因。至于具体的解决,视不同情况而定。例如,我们在调用gethostbyname进行DNS域名解析时,如果没有开启RPC,也会出现类似的提示信息,这种情况的解决方法就是开启RPC,或者使用更底层的函数取代gethostbyname,——火狐浏览器在DNS解析时就是这么处理的。

 

        SelectActiveFrame问题如何解决?

        http://topic.csdn.net/u/20090824/17/01be9af4-f62c-4ff0-a5a5-27599f3818ab.html

http://topic.csdn.net/u/20090114/18/07ac1cb8-d5c1-4845-b947-d95d2047b08a.html

http://dotnet.itags.org/dotnet-tech/73250/

      

This does look like a bug in GDI+. The problem is with the interaction
between the ImageAttributes and the active frame. It appears that any
changes to the ImageAttributes cause the DrawImage() call to use frame 0.

So, one workaround would be to not use the DrawImage() call which uses
ImageAttributes. Another, as you've noted, would be to extract the frame
into another Bitmap and use that instead.

 

        上面提到的,不使用ImageAttributes,我试验了一下,不行。至于说,先解码GIF的帧到新的Bitmap,从而绕过SelectActiveFrame,我想应该是可以的,但是,这会直接导致内存耗用过多!一幅二十帧、160×120的GIF动画,解码到新的Bitmap,需要耗用20×160×120×32/8=约1.5MB内存,这显然是没法接受的。

 

        这个问题也只能是保留。后面可能采用IPicture接口代替GDI+的Gif动画接口。


By: 章永辉

  评论这张
 
阅读(8499)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016