调试VB6崩溃转储文件

5
我有一个VB6应用程序,可以运行在成千上万的计算机上。但是,在极少数的计算机上,我遇到了“该应用程序已停止工作”的错误。我在Vista、Windows 7(x32和x64)以及Windows 8.1上都见过这个错误。
我将其缩小到发生在第一个form_resize事件和主窗口第一次重绘期间实际绘制窗体之间的某个时间点。它发生在我的VB6代码之外的某个位置,因此我无法捕获错误,并且我放置的所有日志都是无用的。例如,如果应用程序启动时主窗口可见,它会崩溃。如果它启动时最小化,它将一直运行,直到激活窗口然后崩溃。今天,我设法从客户的计算机上获取了一个崩溃转储文件(因为我们通常无法在开发计算机上使其崩溃)。以下是WinDBG告诉我的内容。自2012年以来,我一直在努力解决这个问题,希望得到(任何)帮助。
    FOLLOWUP_IP: 
msvbvm60!Zombie_Release+1233b
72960d94 8901            mov     dword ptr [ecx],eax

APP:  timeclockmts.exe

ANALYSIS_VERSION: 6.3.9600.16384 (debuggers(dbg).130821-1623) x86fre

PRIMARY_PROBLEM_CLASS:  WRONG_SYMBOLS

BUGCHECK_STR:  APPLICATION_FAULT_WRONG_SYMBOLS

LAST_CONTROL_TRANSFER:  from 72a09a7b to 72960d94

STACK_TEXT:  
WARNING: Stack unwind information not available. Following frames may be wrong.
00097504 72a09a7b 01396b8c 4fb934ec 60030053 msvbvm60!Zombie_Release+0x1233b
00097544 72a09c2c 01396b8c 00000009 00000000 msvbvm60!BASIC_DISPINTERFACE_GetTypeInfo+0x2aa
00097574 758c370d 01396b8c 00000009 75870630 msvbvm60!EVENT_SINK_Invoke+0x50
000975cc 7589c30e 00000000 000273c9 0b0dcb40 oleaut32!VarMonthName+0x11350
000975e0 758c41e5 00000001 00000002 00000000 oleaut32!VarDecNeg+0x5d45
000975f4 729932c4 0b0dcb40 000273c9 00000000 oleaut32!VarMonthName+0x11e28
00097628 72973db1 0523c0dc 00000012 4180923a msvbvm60!IID_IVbaHost+0x24c84
0009767c 729c1e19 0000000d 4180923a 0523bebc msvbvm60!IID_IVbaHost+0x5771
000976b8 729acdb0 0000000d 4180923a 05221380 msvbvm60!IID_IVbaHost+0x537d9
000976f4 729ad0a1 0523c0dc 0000000d 4180923a msvbvm60!IID_IVbaHost+0x3e770
00097728 72980eed 034a0904 0000000d 00000001 msvbvm60!IID_IVbaHost+0x3ea61
00097988 4fbadfdb 01396a70 000979fc 000979f4 msvbvm60!IID_IVbaHost+0x128ad
00097a20 4fbaa41a 01396a70 0009834c 00098478 ciaXPLabel30!DllCanUnloadNow+0x10efd
00097a5c 75873e75 01396a70 0b0ee654 00000000 ciaXPLabel30!DllCanUnloadNow+0xd33c
00097a78 72a16ef5 01396b8c 0000001c 00000004 oleaut32!DispCallFunc+0xa6
000983d4 72a09a7b 01396b8c 4fb934ec 60030053 msvbvm60!_vbaAptOffset+0x68b
00098414 72a09c2c 01396b8c 00000009 00000000 msvbvm60!BASIC_DISPINTERFACE_GetTypeInfo+0x2aa
00098444 758c370d 01396b8c 00000009 75870630 msvbvm60!EVENT_SINK_Invoke+0x50
0009849c 7589c30e 00000000 000273c9 0b0dcb40 oleaut32!VarMonthName+0x11350
000984b0 758c41e5 00000001 00000002 00000000 oleaut32!VarDecNeg+0x5d45
000984c4 729932c4 0b0dcb40 000273c9 00000000 oleaut32!VarMonthName+0x11e28
000984f8 72973db1 0523c0dc 00000012 4180923a msvbvm60!IID_IVbaHost+0x24c84

3
请先修复您的符号,然后用全新的!analyze -v输出编辑您的帖子。 您粘贴的输出无用,甚至不显示任何信息,甚至无法确定崩溃位置。 要修复符号,请将.sympath设置为SRV * Z:\ symbols * http://msdl.microsoft.com/download/symbols,然后执行.reload /f以获取系统模块和代码的符号,然后执行!analyze -v并粘贴输出。也许有人可以看到模式。(评论框已吞噬了SRV路径中的星号,请在MSDN中阅读_NTSYMBOL_PATH以获取精确语法) - blabb
我实际上花了过去5个小时来解决客户电脑上的问题,他一直遇到崩溃。这是一个第三方控件,已经被废弃了。 - nemmy
好的,我已经按照你的建议修复了符号,现在转储文件的前几十行已经显示出来了。第15行左右列出了有问题的控件(ciaXPLabel30),我是通过反复试验确定它是导致问题的原因。如果我6个小时前知道“修复符号”的意思,我就可以节省半天时间了。不管怎样,还是谢谢你 :) - nemmy
1个回答

3
感谢blabb教我如何修复我的符号并重新运行分析。不幸的是,我已经通过逐一删除表单中的控件,进行了试错自己找到了崩溃的原因。以下是崩溃转储文件中告诉我发生了什么的行:
00097a20 4fbaa41a 01396a70 0009834c 00098478 ciaXPLabel30!DllCanUnloadNow+0x10efd
00097a5c 75873e75 01396a70 0b0ee654 00000000 ciaXPLabel30!DllCanUnloadNow+0xd33c

完整的日志看起来像是一个不断循环尝试处理自身的控件。我已经放弃了该控件,现在事情运行得很顺利。

2
不确定“完整日志的样子”,但从DllCanUnloadNow带有如此大的偏移量,我不会说控件正在处理自己的处置。在这种情况下,您不能依赖于方法名称。大的偏移量意味着WinDbg无法在Microsoft服务器上为该DLL找到符号。尝试lm m ciaXPLabel30以验证您是否没有符号。而且,在窗体的第一个调整大小事件之后立即处置控件也是相当不可能的,您认为呢? - Thomas Weller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接