2009-03-04 11 views
2

私たちはWPFアプリケーションをビルドしており、BCL内から発生していると思われるランダムで非常に奇妙な動作を見ています。我々は、次のスタックトレースで未処理の例外をキャッチされていますTimeSpan.FromSeconds(-1.0)とdouble.NaN

[ArgumentException], 
"TimeSpan does not accept floating point Not-a-Number values." 
    at System.TimeSpan.Interval(Double value, Int32 scale) 
    at System.Windows.Threading.Dispatcher.Invoke(DispatcherPriority priority, Delegate method, Object arg) 
    at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) 
    at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) 
    at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) 
    at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame) 
    at System.Windows.Threading.Dispatcher.Run() 
    at System.Windows.Application.RunDispatcher(Object ignore) 
    at System.Windows.Application.RunInternal(Window window) 
    at System.Windows.Application.Run(Window window) 

、我々はリフレクターを信じるのであれば、呼び出し元のメソッド(Dispatcher.Invoke)は、引数ので、引数の例外をスロー

...,TimeSpan.FromSeconds(-1.0),... 

を呼び出します渡されるのは二重にtrueを返す.NaN。これは明らかに意味をなさないものであり、私たちはこれを非常に困惑していると感じました。

小さなサンプルでこの現象を再現することはできませんでした。そのため、私たちは完全なアプリケーションでこの(および他の一見関連するTimeSpanの例外も)原因を特定する方法を探しています。これらの一見ランダムな原因は何の症状

  • を私たちはこの

    • のように何のためにグーグルで運を持っていない、誰もがそのような行動を見ているか認識して我々は、彼らが我々は、誰かがして私たちを助けることができることを望む質問の数を持っています基本的な数学の振る舞い、スタックやヒープをどうにか破壊していますか?
    • 私は何とかTimeSpan.Interval(おそらくWinDbg?)でILをデバッグし、スタック/ヒープを改ざんして検査して値を確認できますか?

    私たちのアプリケーションは非常にデータが重く、多くのデータが非同期に取り込まれ、データバインディングがたくさんありますが、私たちが得ることができたスタックトレースから、これを指し示す煙草はないとわかります。

    質問を明確にするには:前に説明した動作を誰かが見たことがありますか、症状を認識しているか、状況をデバッグする方法を入力しましたか?

    思考、コメント、アイデア、提案?

  • +0

    私はこれをMicrosoftに報告しようとします。かなり奇妙な行動のように聞こえる。 – leppie

    +0

    まったく同じsimptom、同じスタックトレースがあります。しかし、私はどこを見るかの手掛かりはありません。私たちのプログラムも大きく、TimeSpan.From ...の呼び出しはすべてNaNを含むことができないint-sで行われます。 –

    答えて

    1

    私はあなたの質問を正しく理解していませんが、私は-1.0がNaNではないと思います。

    EDIT(実際の問​​題を解決するために):.NET Frameworkシンボルをダウンロードしてデバッグして、TimeSpan.FromSecondsに渡される変数の実際の値とそれ以外に起こっている可能性のあるものを確認できます。

    +0

    これはまさに私たちが困惑している理由です! Reflectorが正しい場合、TimeSpan.FromSeconds(-1.0)は例外をスローしません。しかし、それは私たちのマシン上の状況であり、何が起こっているのかを理解するためには必死になっています。 –

    +0

    これを試しましたが、VSデバッグではすべてが最適化されているので、 /変数または引数の値...おそらく私たちは何か間違っているか、引数と変数を調べるためのヒントを必要としています –

    1
    1.0/0 
    

    => NaNに 正の無限大

    0/0.0を考えていました:|

    +0

    タイトルと混同して1を参照しています...しかし、 TimeSpan.FromSeconds()メソッドを呼び出すのはコードではなく、内部BCL呼び出しです。 –

    +0

    私はここで目標を外していますが、まだ答えを探しています:) – leppie

    0

    可能性がありますスタックトレースの多くは最適化されているとあなたがそこに表示されていないtimespansのものをやっているいくつかのコードがあります。

    EDIT:

    リフレクターに私はTimespan.Intervalを呼び出すDispatcher.InvokeコールTimespan.FromMillisecondsを参照してください。しかし、スタックトレースでは、Dispatcher.InvokeとTimespan.Intervalだけが表示されるため、Timespan.FromMillisecondsはスタックトレースから除外されています。メソッドをスタックトレースから除外できると仮定すると、Timespan.Intervalとはまったく異なるパスが存在する可能性があります。言う:

     
    Dispatcher.Invoke 
    Dispatcher.InvokeImpl 
    Dispatcher.BeginInvoke 
    - Call into your code or somewhere else in BCL - 
    Timespan.Interval 
    

    制御フローがある場合Dispatcher.Invoker-> Timepan.FromMilliseconds - > Timespan.Intervalそれから私は、JITコンパイルのバグまたは実行されているネイティブコードから腐敗のいくつかの種類を疑う開始します予め。ここ

    は、JITによって生成されたコードを参照する方法についてのページです: http://blogs.msdn.com/vancem/archive/2006/02/20/535807.aspx

    +0

    実際に起こっていることは分かりませんこの特定のstacktraceは完全にBCLコードであり、例外が内部メソッドTimeSpan.Interval(例外メッセージとの一致など)からスローされることは非常にはっきりしています...しかし、間違っている可能性がありますのでご了承ください。 –

    +0

    私は、あなたが意味することを理解しています。私はこれが当てはまらないと思っています。私たちのコードを呼び出すのは間違いです(デバッガが例外を壊すと信じることができれば)。そしてリフレクターを調べるときに、呼び出し元が何か別のシナリオを考え出すのに苦労します。 –

    1

    スタックトレースの簡単なメモを、彼らは一定の要件を満たす場合には、メソッド呼び出しをインライン化することができます。

    L_0002: ldc.r8 -1 
    L_000b: call valuetype [mscorlib]System.TimeSpan [mscorlib]System.TimeSpan::FromMilliseconds(float64) 
    

    私のテストコード、C#の:

    次のILコードになり

    double d = -1.0; 
    TimeSpan t = TimeSpan.FromMilliseconds(d); 
    

    詳細情報については、Dispatcher.Invokeコールのhttp://blogs.msdn.com/ericgu/archive/2004/01/29/64717.aspx

    ILコードを読み取ります

    L_0001: ldc.r8 -1 
    L_000a: stloc.0 
    L_000b: ldloc.0 
    L_000c: call valuetype [mscorlib]System.TimeSpan [mscorlib]System.TimeSpan::FromMilliseconds(float64) 
    

    正確に同じ値をTimeSpanに渡しても、私はあなたの問題を繰り返すことはできません。ミリ秒