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

mie

 
 
 

日志

 
 

VC 2008:GDI+,DrawString,××.exe 中的 0x7c9301b3 处未处理的异常: 0xC0000005: 写入位置 0x4ae9d7be 时发生访问冲突  

2010-09-18 13:54:55|  分类: 疑难杂症 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

××.exe 中的 0x7c9301b3 处未处理的异常: 0xC0000005: 写入位置 0x4ae9d7be 时发生访问冲突

异常中断发生在GdiPlusGraphics.h的1209行:
    Status
    DrawString(
        IN const WCHAR        *string,
        IN INT                 length,
        IN const Font         *font,
        IN const RectF        &layoutRect,
        IN const StringFormat *stringFormat,
        IN const Brush        *brush
    )
    {
        return SetStatus(DllExports::GdipDrawString(
            nativeGraphics,
            string,
            length,
            font ? font->nativeFont : NULL,
            &layoutRect,
            stringFormat ? stringFormat->nativeFormat : NULL,
            brush ? brush->nativeBrush : NULL
        ));
    }

 

反汇编:


    Status
    DrawString(
        IN const WCHAR        *string,
        IN INT                 length,
        IN const Font         *font,
        IN const RectF        &layoutRect,
        IN const StringFormat *stringFormat,
        IN const Brush        *brush
    )
    {
0046F730  push        ebp 
0046F731  mov         ebp,esp
0046F733  sub         esp,0D8h
0046F739  push        ebx 
0046F73A  push        esi 
0046F73B  push        edi 
0046F73C  push        ecx 
0046F73D  lea         edi,[ebp-0D8h]
0046F743  mov         ecx,36h
0046F748  mov         eax,0CCCCCCCCh
0046F74D  rep stos    dword ptr es:[edi]
0046F74F  pop         ecx 
0046F750  mov         dword ptr [ebp-8],ecx
        return SetStatus(DllExports::GdipDrawString(
            nativeGraphics,
            string,
            length,
            font ? font->nativeFont : NULL,
            &layoutRect,
            stringFormat ? stringFormat->nativeFormat : NULL,
            brush ? brush->nativeBrush : NULL
        ));
0046F753  cmp         dword ptr [brush],0
0046F757  je          Gdiplus::Graphics::DrawString+37h (46F767h)
0046F759  mov         eax,dword ptr [brush]
0046F75C  mov         ecx,dword ptr [eax+4]
0046F75F  mov         dword ptr [ebp-0D0h],ecx
0046F765  jmp         Gdiplus::Graphics::DrawString+41h (46F771h)
0046F767  mov         dword ptr [ebp-0D0h],0
0046F771  cmp         dword ptr [stringFormat],0
0046F775  je          Gdiplus::Graphics::DrawString+54h (46F784h)
0046F777  mov         edx,dword ptr [stringFormat]
0046F77A  mov         eax,dword ptr [edx]
0046F77C  mov         dword ptr [ebp-0D4h],eax
0046F782  jmp         Gdiplus::Graphics::DrawString+5Eh (46F78Eh)
0046F784  mov         dword ptr [ebp-0D4h],0
0046F78E  cmp         dword ptr [font],0
0046F792  je          Gdiplus::Graphics::DrawString+71h (46F7A1h)
0046F794  mov         ecx,dword ptr [font]
0046F797  mov         edx,dword ptr [ecx]
0046F799  mov         dword ptr [ebp-0D8h],edx
0046F79F  jmp         Gdiplus::Graphics::DrawString+7Bh (46F7ABh)
0046F7A1  mov         dword ptr [ebp-0D8h],0
0046F7AB  mov         eax,dword ptr [ebp-0D0h]
0046F7B1  push        eax 
0046F7B2  mov         ecx,dword ptr [ebp-0D4h]
0046F7B8  push        ecx 
0046F7B9  mov         edx,dword ptr [layoutRect]
0046F7BC  push        edx 
0046F7BD  mov         eax,dword ptr [ebp-0D8h]
0046F7C3  push        eax 
0046F7C4  mov         ecx,dword ptr [length]
0046F7C7  push        ecx 
0046F7C8  mov         edx,dword ptr [string]
0046F7CB  push        edx 
0046F7CC  mov         eax,dword ptr [this]
0046F7CF  mov         ecx,dword ptr [eax]
0046F7D1  push        ecx 
0046F7D2  call        GdipDrawString (5A6CF8h)
0046F7D7  push        eax         ——中断
0046F7D8  mov         ecx,dword ptr [this]
0046F7DB  call        Gdiplus::Graphics::SetStatus (46F9C0h)
    }

寄存器:

EAX = 00000000 EBX = 00000000 ECX = 00000000 EDX = 00000000 ESI = 00000000 EDI = 00000000 EIP = 0046F7D7 ESP = 0207DEB0
EBP = 0207DFB0 EFL = 00000000

4AE9D7BE = EC

 

这个问题不是每次都出现,但是,如果操作过快,窗口刷新频繁,就会出现。

初步判断,可能是多线程同时调用GdipDrawString导致冲突。

 

我之前把所有的文字输出都封装在一个函数中,于是,在这个函数的DrawString前面,加入下面的代码:
    static CTL_CriticalSection g_lock;
    CTL_AutoLock lock(&g_lock);
使用一个静态全局锁,防止多线程冲突。

——但是,还是不行。

 

最终解决:

由于列表窗口的刷新,造成了访问冲突。因为代码有点多,我就没有再仔细分析原因了。

 

此类问题,应该是函数调用栈溢出,或者其他原因导致栈溢出。和程序有关了,自己慢慢查吧。

 

By: zhanyonhu

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

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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