mono C# 編譯器的一個bug

來源:互聯網
上載者:User
問題來源

我最近的一個項目是用 C# 語言開發的。該項目主要分成以下幾個部分:

  • 運行在 SUSE Linux Enterprise Server 11 SP1 作業系統下的 MySQL 5.5.23 資料庫。
  • 運行在 SUSE Linux Enterprise Server 11 SP1 作業系統下的後台批配量序,這是通過 corntab 自動定時調度啟動並執行。
  • 運行在 Microsoft Windows Server 2003 R2 SP2 作業系統下的 ASP.NET 4 網站,絕大多數人員通過訪問該網站使用本項目。
  • 運行在 Microsoft Windows XP 等作業系統下的用戶端程式,只有少部分人員需要該用戶端程式。

這個項目使用 Microsoft Visual Studio 2010 SP1 IDE 進行開發。而後台批配量序則是將相關的來源程式拷貝到 Linux 作業系統下,然後使用 Mono 的 xbuild 命令進行編譯。

原來一切都很正常。但是,有一天在使用 Mono 的 xbuild 編譯時間,Mono C# compiler 居然崩潰了。我大吃一驚,還以為是修改代碼時使用了 Mono 不支援的 C# 的功能。後來經過仔細尋找,才發現是 Mono C# compiler 的一個小小的 bug 導致的。

Bug 描述

我們有以下 Tester.cs

1 static class Tester2 {3   static void Main() { }4   static void Test(decimal value = 0) { }5 }

這是一個非常簡單的 C# 程式。使用 Microsoft C# 編譯器編譯一切正常。如果使用 Mono C# compiler 2.10.x 編譯的話,會導致 Mono C# 編譯器崩潰,如下所示:

ben@vbox:~/work> dmcs --versionMono C# compiler version 2.10.6.0ben@vbox:~/work> dmcs Tester.cswe can't encode valuetypes, we should have never reached this lineStacktrace:  at (wrapper managed-to-native) System.Reflection.Emit.TypeBuilder.create_runtime_class (System.Reflection.Emit.TypeBuilder,System.Reflection.Emit.TypeBuilder)   at System.Reflection.Emit.TypeBuilder.CreateType ()   at Mono.CSharp.TypeContainer.CloseType ()   at Mono.CSharp.ModuleContainer.CloseType ()   at Mono.CSharp.Driver.Compile ()   at Mono.CSharp.Driver.Main (string[])   at (wrapper runtime-invoke) .runtime_invoke_int_object (object,intptr,intptr,intptr) Native stacktrace:        /usr/bin/mono() [0x493dda]        /lib64/libpthread.so.0(+0xfd00) [0x7fdfb28eed00]        /lib64/libc.so.6(gsignal+0x35) [0x7fdfb2583d95]        /lib64/libc.so.6(abort+0x17b) [0x7fdfb25852ab]        /usr/bin/mono() [0x5ccb4f]        /usr/bin/mono() [0x5ccbd2]        /usr/bin/mono() [0x4f594e]        /usr/bin/mono() [0x4fcafe]        /usr/bin/mono() [0x4fd4c4]        /usr/bin/mono() [0x50273e]        /usr/bin/mono() [0x50c3ff]        [0x4119ebac]Debug info from gdb:=================================================================Got a SIGABRT while executing native code. This usually indicatesa fatal error in the mono runtime or one of the native librariesused by your application.=================================================================Abortedben@vbox:~/work>
向 Mono Team Dev提交 Bug

我已經於 2012-04-02 將這個 bug 提交給 xamarin.com,即 Bug 4184: C# method optional argument is decimal type, C# compiler aborted.。 處理該 bug 的 Marek Safar 回覆說:Already fixed in master and Mono 2.11。在我的提問下,他進一步解釋說:

master is the latest mono code from github.
Mono 2.10.* has not been fixed. Upgrade to Mono 2.11

也就是說,目前 Latest Stable Version 的 Mono C# compiler 中還是有這個 bug 的。在 Alpha Version 的 Mono C# compiler 中才修複了這個 bug。

目前的解決方案

以下 C# 程式不會引起 Mono C# compiler 2.10.x 崩潰:

1 static class Tester2 {3   static void Main() { }4   static void Test(decimal value = 0m) { }5 }

注意上述來源程式中第 4 行將 Test 方法的 decimal 類型的選擇性參數 value 初始化為 0m,而不是初始化為 0。

檢驗 Mono C# compiler 2.11.1 是否解決該bug

為了證實 Mono C# compiler 2.11.x 已經修複了這個bug,我下載並安裝了 mono 2.11.1,如下所示:

ben@vbox:~/src> wget http://download.mono-project.com/sources/mono/mono-2.11.1.tar.bz2ben@vbox:~/src> tar xjf mono-2.11.1.tar.bz2ben@vbox:~/src> cd mono-2.11.1ben@vbox:~/src/mono-2.11.1> ./configure --prefix=/opt/mono-2.11.1ben@vbox:~/src/mono-2.11.1> makeben@vbox:~/src/mono-2.11.1> sudo make installben@vbox:~/src/mono-2.11.1> cd ~/workben@vbox:~/work> /opt/mono-2.11.1/bin/mcs --versionMono C# compiler version 2.11.1.0ben@vbox:~/work> /opt/mono-2.11.1/bin/mcs Tester.csben@vbox:~/work>

果然OK了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.