PowerBuilder中嵌入.NET控件的随机崩溃

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

在我们的PowerBuilder(12.1 Build 7217)窗口中添加了一些嵌入的.NET(4.0)控件作为OLE对象之后,我们的应用程序中出现了随机的硬崩溃。 这是一个硬崩溃,因此应用程序中的异常处理不会捕获错误,应用程序只是崩溃

我们已经能够通过自动化的UI测试来复制它,通常在打开和关闭同一组三个或四个窗口不到100次后发生

我们得到的最常见错误代码有以下三种:

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的客户端遇到了类似的问题,这是一个与垃圾收集有关的问题