Re: A Very Troubled Application...
Peter vd Weerd <[email protected]> Tue, 9 Jun 2009 23:59:00 +0200
| Newsgroups | gmane.comp.windows.devel.dotnet.advanced |
|---|---|
| Message-ID | <[email protected]> |
So it is an out-of-process COM-component? Where is the actual access violation? I mean: is it in the process where the real component lives and is the exception marshalled (probably)? Or does it occur in the hosting process? Are you able to try - catch the exception? It is also possible to set an unhandled exception filter on your application: see the Application.ThreadException event. You can log your exception there and try to go on... The hosted process, where the COM-component lives will only die if the refcount goes to zero. To forced decrement the refcnt you can explicitly set the reference to null and do a garbage collection. The other way is to call Marshal.ReleaseComObject() on that reference. Note that ALL references should be handled that way. After that, the process should be gone. ----- Original Message ----- From: "Mike Andrews" <[email protected]> To: <[email protected]> Sent: Tuesday, June 09, 2009 8:57 PM Subject: Re: [ADVANCED-DOTNET] A Very Troubled Application... > Normally I would agree with you but I'm not sure how I can do this. > The real problem is that I need to create the COM object in my primary > .net > assembly (the assembly that handles the necessary method calls to the COM > object to do the work I need done). The COM object then instantiates the > executable. (It's not fun to work with let me tell you...) > > I can do as you suggest, but only my primary .net assembly will utilize > the > COM object and that's where the COMException will occur and then I have no > control over when it crashes. Are you suggesting that I create a > secondary > assembly that wraps the COM object and that that assembly works with the > COM > object and then I can isolate the COM that way and then I utilize my > secondary assembly within my primary assembly? Also, how can I fix the > random behavior exhibited when the application crashes such as an Access > Violation which results in a dialog? > I really appreciate the help. > > Thanks, > Mike > > On Tue, Jun 9, 2009 at 1:42 PM, Peter vd Weerd <[email protected]> wrote: > >> Hi Mike, >> >> Because you use COM-components, and because you don't trust them, >> creating >> a separate AppDomain (.NET's notion of a process) is less robust than a >> separate process. A failing COM-component is able to corrupt the memory >> that >> is used by the .Net VM. Even memory that is used by a different >> AppDomain. >> >> Yes, I propose to create an application wrapper, that does nothing more >> than spawning your original application, and wait for it. If it ends (by >> a >> crash), just spawn it again. >> To discriminate between a crash and a normal end, return a special >> non-zero >> returncode from your original application. For instance 123. Of course >> both >> the wrapper and the original app should agree on this value. >> >> The fact that your primary application can be spawned only once doesn't >> feel like a problem: the application wrapper will only spawn a new one if >> the previous instance failed... >> >> /Peter >> >> >> >> ----- Original Message ----- From: "Mike Andrews" < >> [email protected]> >> To: <[email protected]> >> Sent: Tuesday, June 09, 2009 7:08 PM >> Subject: Re: [ADVANCED-DOTNET] A Very Troubled Application... >> >> >> >> Hi Peter, >>> >>> Thanks for the reply. >>> >>> Right now I'm creating a separate AppDomain and instantiating my Wrapper >>> object (which wraps all of the COM method calls because any method call >>> can >>> cause a COM exception) inside that AppDomain. Another problem with this >>> process is that it only allows one instance at a time (by reading the >>> process list and seeing if it's already there and if it is it throws up >>> another dialog). >>> >>> I'm not sure what you mean by creating a worker-process. Would I create >>> an >>> application wrapper that then spawns the primary application? If the >>> primary application fails would the worker-process fail or would I just >>> attempt to restart it? >>> >>> Thanks, >>> Mike >>> >>> On Tue, Jun 9, 2009 at 12:00 PM, Peter vd Weerd <[email protected]> >>> wrote: >>> >>> Mike, >>>> >>>> In general: if you have access violations caused by COM-components, its >>>> not >>>> a good idea to recover from that. >>>> If you can isolate the complete application to a kind of a >>>> worker-process, >>>> you write a controller-program that starts this worker-process, and if >>>> it >>>> fails, just start a new one. >>>> >>>> Windows is very good in recovering from crashed processes: all >>>> resources >>>> are freed. So, when the controller process fires up a new >>>> worker-process >>>> its >>>> a brand new one with clean memory, a clean .NET virtual machine, etc. >>>> >>>> /Peter >>>> >>>> >>>> ----- Original Message ----- From: "Mike Andrews" < >>>> [email protected]> >>>> To: <[email protected]> >>>> Sent: Tuesday, June 09, 2009 6:06 PM >>>> Subject: [ADVANCED-DOTNET] A Very Troubled Application... >>>> >>>> >>>> I have a very troubled application (not mine but a 3rd party) that >>>> likes >>>> >>>>> to >>>>> fail with various Unhandled exceptions (memory access and others) when >>>>> certain files are loaded (I have no idea of the reason). Sometimes >>>>> loading >>>>> a file causes a COM exception to occur (no one knows why and it's very >>>>> unlikely that the manufacturer will ever fix it). This causes the >>>>> entire >>>>> application to crash (and/or provide some other unpredictable >>>>> behavior). >>>>> This does not occur most of the time but only occasionally. However I >>>>> must >>>>> account for these eventualities as this process will be running on >>>>> multiple >>>>> servers and I need it the most stable I can get it. >>>>> >>>>> What I have been doing is looking for the process in the process list >>>>> and >>>>> then killing it. That works most of the time but when one of those >>>>> dialogs >>>>> is thrown up asking you to click OK it really messes things up. I've >>>>> started looking for the dialog, but the time when the dialog appears >>>>> varies >>>>> so any predictability is out. >>>>> >>>>> What I need to know is if it's possible to attach a hook (or some >>>>> other >>>>> such >>>>> mechanism) to the window to intercept any unhandled win32 exceptions >>>>> similar >>>>> to the capability available in the .NET framework. I'm at my wit's >>>>> end >>>>> here >>>>> on this one. I need to create something stable enough so I can >>>>> recover >>>>> on >>>>> the server and continue. >>>>> >>>>> Any help or information would be most appreciated. >>>>> >>>>> Thanks, >>>>> Mike >>>>> >>>>> =================================== >>>>> View archives and manage your subscription(s) at >>>>> http://peach.ease.lsoft.com/archives >>>>> >>>>> >>>>> =================================== >>>> View archives and manage your subscription(s) at >>>> http://peach.ease.lsoft.com/archives >>>> >>>> >>> =================================== >>> View archives and manage your subscription(s) at >>> http://peach.ease.lsoft.com/archives >>> >>> >> =================================== >> View archives and manage your subscription(s) at >> http://peach.ease.lsoft.com/archives >> > > =================================== > View archives and manage your subscription(s) at > http://peach.ease.lsoft.com/archives =================================== View archives and manage your subscription(s) at http://peach.ease.lsoft.com/archives