[Mono-bugs] [Bug 77651][Cos] New - Runtime crashes if the .exe
being run is recompiled
bugzilla-daemon at bugzilla.ximian.com
bugzilla-daemon at bugzilla.ximian.com
Mon Feb 27 06:31:00 EST 2006
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 pawel.sakowski at mind-breeze.com.
http://bugzilla.ximian.com/show_bug.cgi?id=77651
--- shadow/77651 2006-02-27 06:31:00.000000000 -0500
+++ shadow/77651.tmp.31945 2006-02-27 06:31:00.000000000 -0500
@@ -0,0 +1,81 @@
+Bug#: 77651
+Product: Mono: Compilers
+Version: 1.1
+OS: GNU/Linux [Other]
+OS Details:
+Status: NEW
+Resolution:
+Severity:
+Priority: Cosmetic
+Component: C#
+AssignedTo: rharinath at novell.com
+ReportedBy: pawel.sakowski at mind-breeze.com
+QAContact: mono-bugs at ximian.com
+TargetMilestone: ---
+URL:
+Cc:
+Summary: Runtime crashes if the .exe being run is recompiled
+
+Description of Problem:
+When gmcs compiles a previously compiled source, it overwrites the original
+.exe file's contents. If that file is being executed, the unexpected file
+modification makes mono crash (except some trivial cases where there's no
+further code to be executed from the file).
+
+There's no straightforward way to avoid it in the runtime (the .exe would
+have to be locked or held all in the memory). However, this can be easily
+avoided that gmcs triggers the issue. gcc on a compilation first issues an
+unlink(2) on the target file. This way, the target file content's change is
+invisible to the processes that already hold the file open (another inode
+is written to).
+
+I believe Mono should also unlink the target .exe file before writing the
+compilation output.
+
+Steps to reproduce the problem:
+A quick sample of how the issue can be triggered:
+1. Prepare x1.cs with the contents:
+using System;
+using System.Threading;
+class X {
+static void Main() {
+Thread.Sleep(15000);
+B();
+}
+static void B() {
+Console.WriteLine(5);
+}
+}
+2. Prepare x2.cs with the contents:
+using System;
+using System.Threading;
+class X {
+static void Main() {
+Thread.Sleep(15000);
+B(4);
+}
+static void B(int i) {
+Console.WriteLine(i);
+}
+}
+3. Issue the command sequence:
+cp x1.cs x.cs
+gmcs x.cs
+mono x.exe&
+cp x2.cs x.cs
+gmcs x.cs
+4. Wait until the Sleep runs out.
+
+Actual Results:
+** ERROR ** : file loader.c: line 1667 (mono_method_get_header): assertion
+failed: (loc)
+aborting
+
+Expected Results:
+"5" on the console
+
+How often does this happen?
+The crash itself is not very deterministic. It depends on various factors,
+with different code samples I saw various assertion failures triggered, in
+some cases the execution proceeded without obstruction. The file overwrite
+happens 100%.
More information about the mono-bugs
mailing list