[Mono-bugs] [Bug 24104] New - uncaught exceptions in threads other than the main thread crash mono

bugzilla-daemon@rocky.ximian.com bugzilla-daemon@rocky.ximian.com
2 May 2002 03:58:45 -0000


Please do not reply to this email- if you want to comment on the bug, go to the
URL shown below and enter your comments there.

Changed by linus@linus.com.

http://bugzilla.ximian.com/show_bug.cgi?id=24104

--- shadow/24104	Wed May  1 23:58:45 2002
+++ shadow/24104.tmp.6279	Wed May  1 23:58:45 2002
@@ -0,0 +1,70 @@
+Bug#: 24104
+Product: Mono/Runtime
+Version: unspecified
+OS: 
+OS Details: 
+Status: NEW   
+Resolution: 
+Severity: 
+Priority: Critical
+Component: misc
+AssignedTo: mono-bugs@ximian.com                            
+ReportedBy: linus@linus.com               
+QAContact: mono-bugs@ximian.com
+TargetMilestone: ---
+URL: 
+Cc: 
+Summary: uncaught exceptions in threads other than the main thread crash mono
+
+Description of Problem:
+
+If there is an uncaught exception in a thread other than the main thread, 
+mono will crash (I've only tested Windows). This is becuase the code in 
+jit/exception.c assumes there is only one stack. It compares EBP to a 
+single global variable mono_end_of_stack that was initialized from a 
+stack variable in the main thread.
+
+Steps to reproduce the problem:
+
+The following program will crash when run with mono.
+
+// MultiThreadExceptionTest.cs
+
+using System;
+using System.Threading;
+
+public class MultiThreadExceptionTest {
+	public static void MyThreadStart() {
+		Console.WriteLine("{0} started", 
+Thread.CurrentThread.Name);
+		throw new Exception();
+	}
+
+	public static void Main() {
+		Thread t1 = new Thread(new ThreadStart
+(MultiThreadExceptionTest.MyThreadStart));
+		t1.Name = "Thread 1";
+
+		Thread t2 = new Thread(new ThreadStart
+(MultiThreadExceptionTest.MyThreadStart));
+		t2.Name = "Thread 2";
+
+		t1.Start();
+		t2.Start();
+	}
+}
+
+Expected Results:
+
+The AppDomain.UncaughtException event should be called for each thread.
+
+Additional Information:
+
+The obvious solution is to keep an _end_of_stack for each thread. I don't 
+know anything about Windows Structured Exception Handling (SEH), but I 
+read on the Rotor list that .Net exceptions are somehow "compatible" with 
+SEH. I think there is some level of interoperability between unmanaged 
+and managed exceptions in .Net on Windows. I don't know if this is 
+desirable in mono or if an analog exists on Linux.
+
+I don't know if the same problem exists in mint.