Re: A Very Troubled Application...

Peter vd Weerd <[email protected]> Wed, 10 Jun 2009 22:16:54 +0200
Newsgroups gmane.comp.windows.devel.dotnet.advanced
Message-ID <[email protected]>
Right, codesegments are shared between processes. But this is done using the 
memorymapped segments I wrote about earlier. These segments are use-counted, 
but on a handle basis. Since the system does a cleanup (close) on all 
handles, the memorymap will be freed (after the last using handle has been 
closed), and therefore the DLL...

I think you are referring to Win95 or so...
I cannot quickly find a reference on this part, but I encourage you to peek 
around using process explorer from sysinternals.
If you don;t trust the cleanup, write an application that loads a dll a lot 
of times, and than kill the process from process explorer. You will see that 
also the loaded DLL is gone.

/P

----- Original Message ----- 
From: "Adam Tuliper" <[email protected]>
To: <[email protected]>
Sent: Wednesday, June 10, 2009 6:22 PM
Subject: Re: [ADVANCED-DOTNET] A Very Troubled Application...


> we had to do the same hacks for word.. using it as server side doc
> generation before good pdf components were available to us and I recall 
> word
> would fail after a while. that goodness we've come a long way  : )
>
> For dlls being cleaned at termination time.. library code segments are
> shared between processes (that reference the same lib). So there is only 
> one
> code section in memory (unless specifically designated otherwise I 
> believe).
> When LoadLibrary is called, ref count is incremented. So when a process
> crashes.. how does the system know what to decrement counts for? I don't
> believe it does.. and hence a potential memory issue with crashed
> appliations leaving resources around.  If I'm not 100% correct on this.. I
> would like to know a reference to how the system cleans up.. Id be curious
> of the inner workings, this is all from rusty memory.
>
>
>
>
>
> On Wed, Jun 10, 2009 at 2:01 AM, Peter vd Weerd <[email protected]> wrote:
>
>> When windows terminates a process, all system-resources are cleaned up.
>> Dll's too. They are loaded in the virtual address space, and the address
>> space is removed at termination.
>> Reference counting on dll's is only within a process. AFAIK there is no
>> system-wide refcnt.
>>
>> Dll's are loaded by creating a named filemapping to this dll. This 
>> mapping
>> is a normal system resource and will be freed at termination time.
>>
>> Out of process COM objects are a different story. The process where this
>> COM-object lives has nothing to do with the hosting process (as far as 
>> the
>> system knowns). And it is refcnted.
>>
>> So if the host process is getting terminated, the only way for the COM
>> process to get auto terminated is to do a watchdog check on its host if 
>> its
>> still alive. There are some watchdog checks in the standard marshalling 
>> code
>> (hartbeats), but I'm not sure if they are used for terminating the 
>> process
>> with the COM object. Another question is how big the timeout for this
>> watchdog is. So may be you want to restart the COM object before the
>> watchdog timed out.
>>
>> I used my proposed solution (restarting the process after failure) a few
>> times in case of untrusted applications, and it worked fine. I can 
>> remember
>> problems with MSWord (out of process COM) years ago. After failure (the
>> process using MSWord died) I killed the MSWord instance too and than
>> restarted my application. Ugly, but it worked.
>> I had more problems there, because word was not designed as a service. 
>> Its
>> a UI, so it will popup a dialog every now and than. I had to 'answer' 
>> those
>> dialogs too :-)
>>
>> /Peter
>> ----- Original Message ----- From: "Adam Tuliper" 
>> <[email protected]>
>> To: <[email protected]>
>> Sent: Tuesday, June 09, 2009 10:30 PM
>> Subject: Re: [ADVANCED-DOTNET] A Very Troubled Application...
>>
>>
>>
>>  I seem to recall the opposite was true.. Windows isn't very good about
>>> cleaning up resources (at least in the past) because of the way 
>>> libraries
>>> dont get freed because the reference count handling is never executed..
>>> something along those lines. Although if someone can provide some more
>>> technical reference on if this is true or not.. Id love to read it.
>>>
>>>
>>>
>>> On Tue, Jun 9, 2009 at 1: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