PowerBuilder中嵌入.NET控件的随机崩溃
在我们的PowerBuilder(12.1 Build 7217)窗口中添加了一些嵌入的.NET(4.0)控件作为OLE对象之后,我们的应用程序中出现了随机的硬崩溃。 这是一个硬崩溃,因此应用程序中的异常处理不会捕获错误,应用程序只是崩溃 我们已经能够通过自动化的UI测试来复制它,通常在打开和关闭同一组三个或四个窗口不到100次后发生 我们得到的最常见错误代码有以下三种:PowerBuilder中嵌入.NET控件的随机崩溃,.net,crash,clr,ole,powerbuilder,.net,Crash,Clr,Ole,Powerbuilder,在我们的PowerBuilder(12.1 Build 7217)窗口中添加了一些嵌入的.NET(4.0)控件作为OLE对象之后,我们的应用程序中出现了随机的硬崩溃。 这是一个硬崩溃,因此应用程序中的异常处理不会捕获错误,应用程序只是崩溃 我们已经能够通过自动化的UI测试来复制它,通常在打开和关闭同一组三个或四个窗口不到100次后发生 我们得到的最常见错误代码有以下三种: 0xC0000005 EXCEPTION_ACCESS_VIOLATION The thread tried to re
0xC0000005 EXCEPTION_ACCESS_VIOLATION The thread tried to read from or write to a virtual address for which it does not have the appropriate access.
0x80000003 EXCEPTION_BREAKPOINT A breakpoint was encountered.
0xc0000409 Unknown software exception (Application Error)
以下是Windows事件查看器中的一些示例错误:
Faulting application name: [OUR APP NAME], version: 1.0.0.1, time stamp: 0x512de438
Faulting module name: unknown, version: 0.0.0.0, time stamp: 0x00000000
Exception code: 0x80000003
Fault offset: 0x048495b4
Faulting process id: 0x2fc
Faulting application start time: 0x01cfa28c02e07932
Faulting application path: C:\Program Files (x86)\..........[our app exe]
Faulting module path: unknown
Report Id: 9c101a2e-0e7f-11e4-815e-0026b9806e38
Faulting application name: [OUR APP NAME], version: 1.0.0.1, time stamp: 0x512de438
Faulting module name: clr.dll, version: 4.0.30319.18444, time stamp: 0x52717e84
Exception code: 0xc0000005
Fault offset: 0x000fe810
Faulting process id: 0x2fc
Faulting application start time: 0x01cfa28c02e07932
Faulting application path: C:\Program Files (x86)\..........[our app exe]
Faulting module path: C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
Report Id: a5b51191-0e7f-11e4-815e-0026b9806e38
Faulting application name: [OUR APP NAME], version: 1.0.0.1, time stamp: 0x512de438
Faulting module name: ntdll.dll, version: 6.1.7601.18229, time stamp: 0x51fb1072
Exception code: 0xc0000029
Fault offset: 0x00090892
Faulting process id: 0x272c
Faulting application start time: 0x01cfa29978c86751
Faulting application path: C:\Program Files (x86)\..........[our app exe]
Faulting module path: C:\WINDOWS\SysWOW64\ntdll.dll
Report Id: 983c1451-0e8d-11e4-a4b9-b8ca3a74f207
应用程序甚至没有在我们的代码上崩溃,但通常在CLR代码或PBVM代码中的某个地方。崩溃转储中的调用堆栈甚至不包含我们的任何函数,它似乎纯粹是.NET framework/CLR代码。下面的调用堆栈是我们通常看到的,但即使这样,从一次崩溃到下一次崩溃也不一致:
clr.dll!string "d:\\iso_whid\\x86fre\\base\\ntos\\rtl"...() + 0x4f3b9b bytes
ntdll.dll!ExecuteHandler@20() + 0x24 bytes
ntdll.dll!_KiUserExceptionDispatcher@8() + 0xe bytes
0b1cb4b4()
clr.dll!GetFastContextCookie() + 0x1d bytes
clr.dll!CtxEntry::EnterContextCallback() + 0x41 bytes
ole32.dll!CRemoteUnknown::DoCallback() + 0x3b bytes
rpcrt4.dll!_Invoke@12() + 0x30 bytes
rpcrt4.dll!_NdrStubCall2@16() + 0x217 bytes
rpcrt4.dll!_CStdStubBuffer_Invoke@12() + 0x82 bytes
ole32.dll!SyncStubInvoke() + 0x30 bytes
ole32.dll!StubInvoke() + 0x73 bytes
ole32.dll!CCtxComChnl::ContextInvoke() + 0xdb bytes
ole32.dll!MTAInvoke() + 0x1a bytes
ole32.dll!STAInvoke() + 0x4c bytes
ole32.dll!AppInvoke() + 0x8d bytes
ole32.dll!ComInvokeWithLockAndIPID() + 0x21b bytes
ole32.dll!ComInvoke() + 0x71 bytes
ole32.dll!ThreadDispatch() + 0x1a bytes
ole32.dll!ThreadWndProc() + 0x93 bytes
user32.dll!_InternalCallWinProc@20() + 0x28 bytes
user32.dll!_UserCallWinProcCheckWow@32() + 0xa2 bytes
user32.dll!_DispatchMessageWorker@8() + 0xc8 bytes
user32.dll!_DispatchMessageW@4() + 0xf bytes
ole32.dll!CCliModalLoop::PeekRPCAndDDEMessage() - 0x7982 bytes
ole32.dll!CCliModalLoop::BlockFn() + 0x1143 bytes
ole32.dll!_CoWaitForMultipleHandles@20() + 0xb7 bytes
clr.dll!MsgWaitHelper() + 0x6f bytes
clr.dll!Thread::DoAppropriateAptStateWait() + 0x12524 bytes
clr.dll!Thread::DoAppropriateWaitWorker() + 0xe9 bytes
clr.dll!Thread::DoAppropriateWait() + 0x60 bytes
clr.dll!Thread::JoinEx() + 0x83 bytes
clr.dll!Thread::Join() + 0x16 bytes
clr.dll!RCW::Initialize() + 0x1cb81f bytes
clr.dll!RCW::CreateRCW() + 0x62 bytes
clr.dll!COMInterfaceMarshaler::CreateObjectRef() + 0x4e bytes
clr.dll!COMInterfaceMarshaler::FindOrCreateObjectRef() + 0x8c bytes
clr.dll!GetObjectRefFromComIP() + 0x125 bytes
clr.dll!UnmarshalObjectFromInterface() + 0x1b bytes
clr.dll!StubHelpers::InterfaceMarshaler__ConvertToManaged() + 0xc6 bytes
System.Windows.Forms.ni.dll!7ba745e0()
[Frames below may be incorrect and/or missing, no symbols loaded for System.Windows.Forms.ni.dll]
clr.dll!_COMToCLRDispatchHelper@28() + 0x28 bytes
clr.dll!BaseWrapper<Stub *,FunctionBase<Stub *,&DoNothing<Stub *>,&StubRelease<Stub>,2>,0,&CompareDefault<Stub *>,2>::~BaseWrapper<Stub *,FunctionBase<Stub *,&DoNothing<Stub *>,&StubRelease<Stub>,2>,0,&CompareDefault<Stub *>,2>() + 0x175b8b bytes
clr.dll!COMToCLRWorkerBody() + 0x80 bytes
clr.dll!COMToCLRWorkerDebuggerWrapper() + 0x34 bytes
clr.dll!_COMToCLRWorker@8() + 0x12b bytes
04e7a2c6()
PBVM120.DLL!10b1a856()
clr.dll!字符串“d:\\iso\u whid\\x86fre\\base\\ntos\\rtl”…()+0x4f3b9b字节
ntdll.dll!ExecuteHandler@20()+0x24字节
ntdll.dll_KiUserExceptionDispatcher@8()+0xe字节
0b1cb4b4()
clr.dll!GetFastContextCookie()+0x1d字节
clr.dll!CtxEntry::EnterContextCallback()+0x41字节
ole32.dll!CRemoteUnknown::DoCallback()+0x3b字节
rpcrt4.dll_Invoke@12()+0x30字节
rpcrt4.dll_NdrStubCall2@16()+0x217字节
rpcrt4.dll_CSTDsubbuffer_Invoke@12()+0x82字节
ole32.dll!SyncStubInvoke()+0x30字节
ole32.dll!StubInvoke()+0x73字节
ole32.dll!CCtxComChnl::ContextInvoke()+0xdb字节
ole32.dll!MTAVoke()+0x1a字节
ole32.dll!STAInvoke()+0x4c字节
ole32.dll!AppInvoke()+0x8d字节
ole32.dll!ComInVokeWithLockAndId()+0x21b字节
ole32.dll!ComInvoke()+0x71字节
ole32.dll!ThreadDispatch()+0x1a字节
ole32.dll!ThreadWndProc()+0x93字节
user32.dll_InternalCallWinProc@20()+0x28字节
user32.dll_UserCallWinProcCheckWow@32()+0xa2字节
user32.dll_DispatchMessageWorker@8()+0xc8字节
user32.dll_DispatchMessageW@4()+0xf字节
ole32.dll!CCliModalLoop::PEEKRPCANDDEMESSAGE()-0x7982字节
ole32.dll!CCliModalLoop::BlockFn()+0x1143字节
ole32.dll_CoWaitForMultipleHandles@20()+0xb7字节
clr.dll!MsgWaitHelper()+0x6f字节
clr.dll!线程::DoAppropriateAptStateWait()+0x12524字节
clr.dll!线程::DoAppropriateWaitWorker()+0xe9字节
clr.dll!线程::DoAppropriateWait()+0x60字节
clr.dll!线程::JoinEx()+0x83字节
clr.dll!线程::Join()+0x16字节
clr.dll!RCW::Initialize()+0x1cb81f字节
clr.dll!RCW::CreateRCW()+0x62字节
clr.dll!COMInterfaceMarshaler::CreateObjectRef()+0x4e字节
clr.dll!COMInterfaceMarshaler::FindOrCreateObjectRef()+0x8c字节
clr.dll!GetObjectRefFromComIP()+0x125字节
clr.dll!解组对象FromInterface()+0x1b字节
clr.dll!StubHelpers::InterfaceMarshaler\uuu ConvertToManaged()+0xc6字节
System.Windows.Forms.ni.dll!7ba745e0()
[下面的框架可能不正确和/或缺失,没有为System.Windows.Forms.ni.dll加载符号]
clr.dll_COMToCLRDispatchHelper@28()+0x28字节
clr.dll!BaseWrapper::~BaseWrapper()+0x175b8b字节
clr.dll!COMToCLRWorkerBody()+0x80字节
clr.dll!COMToCLRWorkerDebuggerWrapper()+0x34字节
clr.dll_COMToCLRWorker@8()+0x12b字节
04e7a2c6()
PBVM120.DLL!10b1a856()
即使我们将嵌入式.NET控件剥离到一个简单/空的容器中,其中没有子控件,也没有调用其他重要的代码,我们仍然会遇到崩溃。
请注意,我们只是使用基本数据类型参数对.NET控件进行简单的函数调用
通过在所有.NET控件上手动调用Dispose并强制垃圾收集,我们已经能够极大地提高稳定性,因此,现在我们在显示某些嵌入式.NET控件时似乎根本没有收到错误,但我们仍然会为其他控件收到错误
这似乎不是内存泄漏问题,因为应用程序崩溃时只使用大约100MB的RAM。尽管这看起来确实是某种内存损坏问题,但考虑到CLR代码中的硬崩溃,通常会出现访问冲突错误,并且在我们的控件上调用Dispose似乎可以减少问题的发生
由于应用程序似乎在CLR代码中随机崩溃,我们无法确定问题的确切原因,我们只能说,它似乎只在我们的应用程序中打开嵌入.NET控件的PowerBuilder窗口时发生
我们更新了机器上安装的.NET版本,并应用了热修复程序,看起来它可以解决这个问题(见下文),但这没有帮助
任何帮助都将不胜感激,因为我们一直无法在网上找到任何证据表明其他人也有这个问题 是否将OLE代码包装在TRY、CATCH块中以捕获异常 OLE通常会导致崩溃,因为属性可能不存在,或者在您不期望的情况下可能为null。try-catch块应该允许您从任何OLE异常中优雅地退出 我能想到的另一件事,也是猜测,是64位和32位之间的不匹配。我注意到您的PB程序出现在程序文件下,.NET对象看起来像是在SysWOW64位文件夹中
我想不出任何其他建议,希望这能解决您的问题。是的,它们都是内存损坏问题。NET始终是您对此类问题最不怀疑的。除了令人讨厌之外,根本没有任何关于潜在原因的暗示。你需要的帮助比你在这里得到的要多得多,是打电话给Microsoft还是Sybase支持取决于你。我在使用PB 5的客户端遇到了类似的问题,这是一个与垃圾收集有关的问题