UnHandle exception in *.exe 0xc0000005 :Access violation
004CDBE6 83 66 0C 00          and         dword ptr [esi+0Ch],0
004CDBEA 89 46 04             mov         dword ptr [esi+4],eax
004CDBED 8B 44 24 0C          mov         eax,dword ptr [esp+0Ch]
004CDBF1 C7 06 88 E7 55 00    mov         dword ptr [esi],offset _com_error::`vftable' (0055e788)
004CDBF7 85 C0                test        eax,eax
...单击[确定]后就进入汇编代码,可问题是我不懂汇编啊,也不知如何跟踪到我的错误源码。因为我的工程中使用到多线程,出现这种情况以后如何调试,也就是我如何知道是哪段代码出错了?
并且这个问题不是很容易测试的出来,有时侯很久都不会出现,有时侯一运行就出现。现在我看到这个信息框心里就发毛,怕的很,我相信各位高手一定也遇到过,如何解决,多谢!

解决方案 »

  1.   

    需要生成pdb符号文件,然后用windbg调试
      

  2.   

    http://wenwen.soso.com/z/q63513128.htm
      

  3.   

    TRACE在debug模式下对你的代码调试看看你有没有一个指针释放了两次或者释放后又用了  对你的指针判断一下  应该是指针出的问题
      

  4.   

      7C812AA1 8D 45 B0             lea         eax,[ebp-50h]
      7C812AA4 50                   push        eax
      7C812AA5 FF 15 10 15 80 7C    call        dword ptr ds:[7C801510h]
    ->7C812AAB 5E                   pop         esi //代码停止在这里
      7C812AAC C9                   leave
      7C812AAD C2 10 00             ret         10h
      7C812AB0 85 FF                test        edi,edi代码停止在上面那行,如何查啊?
      

  5.   

    因为是多线程,所以不太好调试.
    不过我根据mayudong1提供的信息"看函数调用栈,是在那个函数中出的错"
    打开了Call stack的窗体,在这个窗体中显示了一大堆,如下:KERNEL32! 7c812aab()
    MSVCRTD! _CxxThrowException@8 + 57 bytes
    _com_raise_error(long -2147467261, IErrorInfo * 0x00000000) + 35 bytes
    _com_issue_error(long -2147467261) + 11 bytes
    _com_ptr_t<_com_IIID<_Connection,&_GUID_00000550_0000_0010_8000_00aa006d2ea4> >::operator->() line 348
    CThreadDispense::RunThread() line 100 + 10 bytes
    _AfxThreadEntry(void * 0x0012d80c) line 125 + 11 bytes
    _threadstartex(void * 0x028b4938) line 227 + 13 bytes
    KERNEL32! 7c80b6d9()点击CThreadDispense::RunThread() line 100 + 10 bytes后进入线程函数RunThread() 
    我想应该是这里出错了吧,结果一查果然是这里,是一个ADO读数据库的问题,当线程结束后我会Close ADO,
    然后主线程又会生成一个新的线程,然后新的线程又会重复读这个数据库,但是因为关闭数据和打开数据库的时间太短,所有时侯会出现旧线程的数据库没有关闭完成,新的线程又来读这个数据库,所以出错了。谢谢各位,我以前都不知怎样用Call stack窗体,现在新学到一招了,对VC的调试没那么茫然了,呵呵!
    另外"需要生成pdb符号文件,然后用windbg调试"我还不知如何使用,有空研究一下.
      

  6.   

    调出call stack 来查看,看最近一个看的懂的函数是什么,估计就在那个函数中,然后在这个函数的起始行设定断点,单步看是在哪里出的错。
      

  7.   

    我前些日子写过一个VC调试信息保存的动态库,你在CSDN上找找,下载一下,记录调试信息的
      

  8.   

    多线程最好写日志,不然调试起来相当麻烦,winbug还是要会使用的,不然就等着头大吧,发堆栈出错信息我们是看不到问题的,你可以call stack看看出错的函数。不过其实这样也不能问题的根源,多线程很有可能是多次循环后,积累了错误,然后再某个函数里报错。
      

  9.   

    这个可能是你的“虚拟继承”造成的。即
    class A
    {};
    class B : public A
    {};class C : public B, virtual public A
    {}导致在类C里面访问A的vtable失效。解决办法是去掉virtual继承。