[Mono-dev] ExecutionEngineException: Couldn't create thread
Robert Jordan
robertj at gmx.net
Fri Jun 23 12:01:36 EDT 2006
Hey,
This bug is already tracked in Bugzilla:
http://bugzilla.ximian.com/show_bug.cgi?id=78241
It's almost fixed, at least it works for me.
Robert
Brian Crowell wrote:
> I've got the following sequence staring at me:
>
> ====================
>
> ** (/opt/ProgramName.Withheld.exe:2670): WARNING **: CreateThread: error
> creating thread handle
>
> Unhandled Exception: System.ExecutionEngineException: Couldn't create thread
> in <0x00000> <unknown method>
> in (wrapper delegate-begin-invoke) System.MulticastDelegate:begin_invoke_IAsyncR
> esult_object_AsyncCallback_object (object,System.AsyncCallback,object)
> in <0x00015> System.Threading.ThreadPool:QueueUserWorkItem (System.Threading.Wai
> tCallback callback, System.Object state)
> in <0x00006> System.Timers.StartTimer ()
> in (wrapper delegate-invoke) System.MulticastDelegate:invoke_void ()
>
> ** (/opt/ProgramName.Withheld.exe:2670): WARNING **: _wapi_handle_unref:
> Attempting to unref unused handle 0x20b3a8
>
> ** (/opt/ProgramName.Withheld.exe:2670): WARNING **: _wapi_handle_unref:
> Attempting to unref unused handle 0x20b2d0
>
> ** (/opt/ProgramName.Withheld.exe:2670): WARNING **: _wapi_handle_unref:
> Attempting to unref unused handle 0x20b120
>
> ** (/opt/ProgramName.Withheld.exe:2670): WARNING **: _wapi_handle_unref:
> Attempting to unref unused handle 0x20b1f8
>
> ====================
>
> ...and there the program has hung.
>
> I'm going to attempt to reproduce the error with a test case, but in the
> meantime, here's the highlights:
>
> ====================
> class MainClass {
> public static int Main( string[] args ) {
> // Check args, return one if there's a problem
>
> _timer = new System.Timers.Timer( 10.0 );
> _timer.BeginInit();
> _timer.AutoReset = false;
> _timer.Elapsed += new System.Timers.ElapsedEventHandler(
> HandleTimerElapsed );
> _timer.EndInit();
> _timer.Start();
>
> // Do not allow the program to end
> Thread.CurrentThread.Suspend();
>
> return 0;
> }
>
> private static void HandleTimerElapsed( object sender,
> System.Timers.ElapsedEventArgs e ) {
> try {
> // Set the interval to something substantially higher
> // (on the order of several minutes)
> _timer.Interval = someLongerInterval;
> _timer.Start();
>
> DoSomethingThatMayOrMayNotBeLongerThanTheInterval();
> }
> catch( ThreadAbortException ) {
> throw;
> }
> catch( Exception ex ) {
> // Default: check every minute if there's an error
> _timer.Interval = 60000.0;
> _timer.Start();
>
> Console.Error.WriteLine( ex );
> }
> }
> }
> ====================
>
> In the instance that produced the above error,
> DoSomethingThatMayOrMayNotBeLongerThanTheInterval() was always shorter than the
> interval. (unless, I suppose, something in that call hung, but then the
> thread-pool should just be starved, and shouldn't throw a wrench)
>
> Other possible sources of threads:
>
> * The program uses remoting heavily
> * The program does a lot of work in a separate AppDomain (but does not
> explicitly create threads, nor uses asynchronous invokes or the thread pool)
> * The program often calls System.Diagnostics.Process.Start() followed by
> process.WaitForExit()
>
> Also, while the program has changed slightly since I last ran it on 1.1.13.4,
> that version did not exhibit this behavior. I am running it on my domain-patched
> 1.1.13.8 (which funnels all cross-domain calls through the CrossAppDomainChannel).
>
> --Brian
More information about the Mono-devel-list
mailing list