程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> mono C# 編譯器的一個bug

mono C# 編譯器的一個bug

編輯:C#入門知識

mono C# 編譯器的一個bug


問題來源

我最近的一個項目是用 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 Tester
    2 {
    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 --version
    Mono C# compiler version 2.10.6.0
    ben@vbox:~/work> dmcs Tester.cs
    we can't encode valuetypes, we should have never reached this line
    Stacktrace:
    
      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 indicates
    a fatal error in the mono runtime or one of the native libraries
    used by your application.
    =================================================================
    
    Aborted
    ben@vbox:~/work>
    

    向 Mono 開發團隊提交 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 Tester
    2 {
    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.bz2
    ben@vbox:~/src> tar xjf mono-2.11.1.tar.bz2
    ben@vbox:~/src> cd mono-2.11.1
    ben@vbox:~/src/mono-2.11.1> ./configure --prefix=/opt/mono-2.11.1
    ben@vbox:~/src/mono-2.11.1> make
    ben@vbox:~/src/mono-2.11.1> sudo make install
    ben@vbox:~/src/mono-2.11.1> cd ~/work
    ben@vbox:~/work> /opt/mono-2.11.1/bin/mcs --version
    Mono C# compiler version 2.11.1.0
    ben@vbox:~/work> /opt/mono-2.11.1/bin/mcs Tester.cs
    ben@vbox:~/work>

     

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved