2

C#でプログラムを書いています。F# マップを使用します。

プログラムはエラーなしで正常に実行されます。ただし、次のようにプロファイリングしようとすると:

mono --profile=log:report Program.exe

次のエラーが表示されます。

[ERROR] FATAL UNHANDLED EXCEPTION: System.ArgumentException: Object is not a Bar 
 at Test.Bar.CompareTo (System.Object obj) [0x00000] in <filename unknown>:0 
 at 
 Microsoft.FSharp.Core.LanguagePrimitives+HashCompare.GenericCompare$cont@923-1       
(Microsoft.FSharp.Core.GenericComparer comp, System.Object yobj, System.Object xobj,   
IComparable x, Microsoft.FSharp.Core.Unit unitVar) [0x00000] in <filename unknown>:0 
at Microsoft.FSharp.Core.LanguagePrimitives+HashCompare.GenericCompare 
(Microsoft.FSharp.Core.GenericComparer comp, System.Object xobj, System.Object yobj)
[0x00000] in <filename unknown>:0 
at 
Microsoft.FSharp.Core.LanguagePrimitives
+HashCompare.GenericComparisonWithComparerIntrinsic[Bar] 
(IComparer comp, Test.Bar x, Test.Bar y) [0x00000] in <filename unknown>:0
at   
Microsoft.FSharp.Core.LanguagePrimitives+HashCompare.GenericComparisonIntrinsic[Bar]
(Test.Bar x, Test.Bar y) [0x00000] in <filename unknown>:0 
at Microsoft.FSharp.Core.LanguagePrimitives+-cctor@2099-1[Test.Bar].Compare 
(Test.Bar   x, Test.Bar y) [0x00000] in <filename unknown>:0 
at Microsoft.FSharp.Collections.MapTreeModule.add[Bar,Foo] (IComparer`1
comparer, Test.Bar k, Test.Foo v, Microsoft.FSharp.Collections.MapTree`2
m) [0x00000] in <filename unknown>:0 
at Microsoft.FSharp.Collections.MapTreeModule.mkFromEnumerator[Bar,Foo] 
(IComparer`1 comparer, Microsoft.FSharp.Collections.MapTree`2 acc, IEnumerator`1 e)
[0x00000] in <filename unknown>:0 
at Microsoft.FSharp.Collections.MapTreeModule.ofSeq[Bar,Foo] (IComparer`1   
comparer, IEnumerable`1 c) [0x00000] in <filename unknown>:0 
at Microsoft.FSharp.Collections.FSharpMap`2[Test.Bar,Test.Foo]..ctor 
(IEnumerable`1 elements) [0x00000] in <filename unknown>:0 

プロファイラーでプログラムを実行したときにのみ、クラス Bar のメソッド CompareTo(object obj) が呼び出され、Bar とは思えないものがあるようです。

そのメソッドは次のように実装されています。

public int CompareTo(object obj) 
{
    if (obj == null) return 1;

    Bar otherBar = obj as Bar;
    if (otherBar != null) 
        return this.CompareTo(otherBar);
    else
        throw new ArgumentException("Object is not a Bar!");
}       

上記のように、プロファイリングを行わないと、このエラーは発生しません。

mono --version は以下を提供します:

Mono JIT compiler version 2.10.5 (Debian 2.10.5-1)
Copyright (C) 2002-2011 Novell, Inc, Xamarin, Inc and Contributors. www.mono-project.com
       TLS:           __thread
       SIGSEGV:       altstack
       Notifications: epoll
       Architecture:  x86
       Disabled:      none
       Misc:          softdebug 
       LLVM:          supported, not enabled.
       GC:            Included Boehm (with typed GC and Parallel Mark)

アップデート:

mono --profile=log:sample Program.exe
mono --profile=log:nocalls Program.exe

どちらも機能します。ただし、標準のプロファイラーも機能させたいと思います。

これは Mono のバグですか、それとも何か間違っていますか?

4

1 に答える 1

1

クロスプラットフォーム パッケージの F#の公式ページによると、Mono 2.10.9 以降を使用する必要があります。

そのため、最初に mono をアップグレードしてみてください。

于 2012-08-07T16:00:50.663 に答える