none
VC6 程序异常 c0000005 CreateSystemThreads RRS feed

  • 问题

  • 要疯掉了,来这里求高手帮助。

    我们用vc 6开发了一个程序,但是在windows 2003的某些机器上,莫名其妙的会发生程序异常,
    #每次异常的时候,出问题的stack情报各不相同,感觉在任何时候任何情况下都可能会发生异常的样子。

    最近一次爆掉的watson log如下(Image_Watch.exe是我们开发的程序)。
    Image_Watch!IManagerController::IManagerController+0xb5ce3  这一行锁定的程序地址是 CApp里面的initinstance的DoModal主对话框的附近。
    然后程序里面的log显示,最后用户只是打开了一个菜单而已。。。。
    不知道  CreateSystemThreads  这个东西会在什么情况下出现异常阿,有熟悉的高手麻烦解答一下了。

    *----> スレッド Id 0xa10 の状態のダンプ  <----*

    eax=00000002 ebx=c80110b1 ecx=00000a02 edx=7c9785ec esi=00200020 edi=00173d20
    eip=77ebd0ab esp=0012337c ebp=00123388 iopl=0         nv up ei pl nz na pe nc
    cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010202

    *** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\WINDOWS\system32\USER32.dll -
    ファンクション: USER32!CreateSystemThreads
            77ebd095 55               push    ebp
            77ebd096 8bec             mov     ebp,esp
            77ebd098 53               push    ebx
            77ebd099 56               push    esi
            77ebd09a 57               push    edi
            77ebd09b 8b7d08           mov     edi,[ebp+0x8]
            77ebd09e 8b37             mov     esi,[edi]
            77ebd0a0 6a02             push    0x2
            77ebd0a2 ff750c           push    dword ptr [ebp+0xc]
            77ebd0a5 ff15e414e977     call    dword ptr [USER32+0x14e4 (77e914e4)]
    フォールト ->77ebd0ab 8a5e20           mov     bl,[esi+0x20]           ds:0023:00200040=??
            77ebd0ae 80e30f           and     bl,0xf
            77ebd0b1 80fb01           cmp     bl,0x1
            77ebd0b4 0f872bf7ffff     jnbe    USER32!CreateSystemThreads+0x21 (77ebc7e5)
            77ebd0ba b835010000       mov     eax,0x135
            77ebd0bf 50               push    eax
            77ebd0c0 ff750c           push    dword ptr [ebp+0xc]
            77ebd0c3 ff36             push    dword ptr [esi]
            77ebd0c5 e843c9fdff       call    USER32!EndDialog+0x22b (77e99a0d)
            77ebd0ca 894508           mov     [ebp+0x8],eax
            77ebd0cd 8b4708           mov     eax,[edi+0x8]

    *----> スタック バック トレース <----*
    *** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\WINDOWS\system32\MFC42.DLL -
    *** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\WINDOWS\system32\ntdll.dll -
    *** WARNING: Unable to verify checksum for C:\Program Files\HVR System\‰f‘œŠÄŽ‹ƒ\ƒtƒg\Image_Watch\Image_Watch.exe
    *** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\Program Files\HVR System\‰f‘œŠÄŽ‹ƒ\ƒtƒg\Image_Watch\Image_Watch.exe -
    *** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\WINDOWS\system32\kernel32.dll -
    ChildEBP RetAddr  Args to Child             
    WARNING: Stack unwind information not available. Following frames may be wrong.
    00123388 77ebd75a 00173d20 c80110b1 00ad4588 USER32!CreateSystemThreads+0x8e7
    001233bc 77ebd720 00173d20 c80110b1 00000000 USER32!SendDlgItemMessageA+0xa2
    00123440 77ebcedc 00ad4588 0000000f 00000000 USER32!SendDlgItemMessageA+0x68
    00123460 77eab6e3 000102d2 0000000f 00000000 USER32!CreateSystemThreads+0x718
    0012348c 77eab874 77ebce90 000102d2 0000000f USER32!LoadCursorW+0x4cf5
    00123504 77eabfce 00000000 77ebce90 000102d2 USER32!LoadCursorW+0x4e86
    00123534 77ec0463 77ebce90 000102d2 0000000f USER32!CallWindowProcW+0x75
    00123554 75497ab6 77ebce90 000102d2 0000000f USER32!CallWindowProcA+0x1b
    00123574 75497fb0 0000000f 00000000 00000000 MFC42!Ordinal2385+0x26
    00123598 75499bb7 0000000f 00000000 00000000 MFC42!Ordinal6374+0x40
    001235f8 75499cfe 00124418 00000000 0000000f MFC42!Ordinal1109+0xa7
    0012361c 7554648d 000102d2 0000000f 00000000 MFC42!Ordinal1578+0x3e
    0012364c 77eab6e3 000102d2 0000000f 00000000 MFC42!Ordinal1579+0x4d
    00123678 77eab874 75546440 000102d2 0000000f USER32!LoadCursorW+0x4cf5
    001236f0 77eac8b8 00000000 75546440 000102d2 USER32!LoadCursorW+0x4e86
    0012374c 77eac9c6 00ad4588 0000000f 00000000 USER32!GetMessageW+0x9f
    00123774 7c978536 0012378c 00000018 001237e0 USER32!GetClientRect+0x4a
    001237f0 77eb16e5 0059a7cc 00000001 00123830 ntdll!KiUserCallbackDispatcher+0x2e
    00123800 754d1b70 0059a7cc 00000000 00123884 USER32!DispatchMessageA+0xf
    00123830 754b426e 00000004 00000001 0059a798 MFC42!Ordinal5307+0x40
    00123870 004b7b23 0059a798 0059a798 ffffffff MFC42!Ordinal2514+0x10e
    0012fefc 754a3cab 00000000 00142570 00000000 Image_Watch!IManagerController::IManagerController+0xb5ce3
    0012ff10 004ed9fd 00400000 00000000 00142570 MFC42!Ordinal1576+0x4b
    0012ffc0 7c82f23b 00000000 00000000 7ffdf000 Image_Watch!IManagerController::IManagerController+0xebbbd
    0012fff0 00000000 004ecf86 00000000 78746341 kernel32!ProcessIdToSessionId+0x209

    2009年7月17日 5:13

答案

全部回复

  • 自己先来回复一下,顺便补充一下信息。

    Image_Watch.exe是一个多线程的执行程序,主画面的线程(GUI处理部分),还有后台的从网络接受图像数据的部分(由多个线程在工作)。后台的线程被做到了DLL里面。
    出错比较频繁的是GUI线程,有点怀疑是不是跟多线程的不正确访问有关,不过没什么方向。。。
    2009年7月17日 5:20
  • 地址访问错误,貌似是访问空指针了


    麻烦把正确答案设为解答。
    2009年7月17日 7:39
    版主
  • 多谢楼上回复。

    估计应该是CreateSystemTreads里面访问地址出错吧,
    不过CreateSystemTreads这个API也看不到内部的处理是怎么样子的,不知道具体错在什么地方。比较没有头绪。。。
    我们在source的主对话框的PreTranslate处理里,加了_heapchk的处理,貌似在出问题前也没check出问题来。
    不知道有什么好的主意么

    2009年7月17日 9:03
  • 链接的DLL是否有窗口?另外检查主进程和DLL链接MFC的方式是否一致。错误是在Debug还是Release发生?
    麻烦把正确答案设为解答。
    2009年7月21日 1:00
    版主
  • 上面的堆栈提供的信息很少,而且提供了很多不正确的信息.c0000005是内存访问违规的意思,就是给一个空指针赋值的时候,操作系统给你报告的错误.我觉得应该是你的线程在处理数据(有可能是图像数据),因为没有接受到正确的信息,其他代码处理这些信息(NULL指针)的时候,出现这个问题.
    2009年7月22日 16:24
  • waston里面的.dmp文件贴出来,可以分析一下,请参看我这几篇文章把程序崩溃时的内存文件保存下来,再通过某种途径发给别人看看:

    http://blog.csdn.net/Donjuan/archive/2009/02/02/3859160.aspx

    http://blog.csdn.net/Donjuan/archive/2008/12/04/3446670.aspx
    2009年7月22日 16:28
  • 多谢大家回复,先学习一下 Killmyday得链接。。 ##链接的DLL没有要显示的窗口,但是使用过CSocketWnd。链接MFC得方式确认过是一致的。错误是在release得时候发生的。 这次发生异常的时候没有拿到user.dmp。。。 上次发生异常的时候倒是拿到了user.dmp,不过stack信息又不一样了,不知道怎么上传到论坛来。。。
    2009年7月23日 1:55
  • 之所以说你贴出来的堆栈是错的,是因为:

    00123388 77ebd75a 00173d20 c80110b1 00ad4588 USER32!CreateSystemThreads+0x8e7
    001233bc 77ebd720 00173d20 c80110b1 00000000 USER32!SendDlgItemMessageA+0xa2
    00123440 77ebcedc 00ad4588 0000000f 00000000 USER32!SendDlgItemMessageA+0x68
    00123460 77eab6e3 000102d2 0000000f 00000000 USER32!CreateSystemThreads+0x718

    CreateSystemThreads+0x8e7这一行表示的在CreateSystemThreads函数里面,第8e7(2279行)发生了错误,虽然他是以汇编的行数做基准的,但是也还是比较恐怖的,说明这个函数至少有2279行的汇编代码,如果以平均每一行C代码对应4行汇编代码计算的话,也就是CreateSystemThreads的C代码有500行,一般很少有人会写这么长的函数的。而且从堆栈你也可以看到,里面有两个诡异的递归,一个是CreateSystemThreads,另外一个是SendDlgItemMessageA,过于诡异。
    2009年7月23日 4:32