2011-11-22 8 views
24

RXをより簡単にデバッグ可能にする方法のアイデアを探しています。ソースがコンバイナとスロットルを通過してパブリッシュされるなど、障害の発生箇所を見つけることは非常に困難です。Reactive Extensionsでデバッグするための秘訣はありますか?

これまで複雑なEnumerableチェーンの場合と同様に、Do()をトレースに挿入し、匿名型の部分に「名前」フィールドを追加し、スタックトレースを取得することもありました。私たちのシステムにはおそらく何百というプロデューサーや何千もの消費者がいて、問題を特定するのが非常に難しくなっています。

RXの使用状況をデバッグするにはどんなトリックがありますか? Rxのバグをキャッチするため

+2

私は常に自分のRxコードをデバッグするのに苦労しています。 – Tim

+7

私はcasperOneによってこの質問が非公式に閉鎖されていることに強く反対します。私は非常に特定の技術の専門知識を探しています。この質問は、「意見、討論、議論、投票、または議論の延長」には至らないでしょう。 – scobi

+1

建設的ではありませんか?たぶん問題は十分に具体的ではないかもしれませんが、それは非常に貴重な質問です。まあ、 "このコードはなぜコンパイルできないのですか"の質問に戻る。 –

答えて

7

私はこのトピックに関するconstructive discussionが代わりにクエリにアドホックDo演算子を追加する、カスタムログ/トレース演算子を追加することになり、2009年

にRxのフォーラムに持ってきたと思います。この演算子は、Subscription、Disposal、OnNext、OnErrorおよびOnCompletedイベントをキャプチャします。実装に応じて、コンソールに書き込んだり、お気に入りのLoggerライブラリを使用したり、OSとVisual Studioの統合用にETWイベントを作成したりすることもできます。

public static class ObservableTrace 
{ 
    public static IObservable<TSource> Trace<TSource>(this IObservable<TSource> source, string name) 
    { 
     int id = 0; 
     return Observable.Create<TSource>(observer => 
     { 
      int id1 = ++id; 
      Action<string, object> trace = (m, v) => Debug.WriteLine("{0}{1}: {2}({3})", name, id1, m, v); 
      trace("Subscribe", ""); 
      IDisposable disposable = source.Subscribe(
       v => { trace("OnNext", v); observer.OnNext(v); }, 
       e => { trace("OnError", ""); observer.OnError(e); }, 
       () => { trace("OnCompleted", ""); observer.OnCompleted(); }); 
      return() => { trace("Dispose", ""); disposable.Dispose(); }; 
     }); 
    } 
} 
+0

試してみてください+ Seq http://www.lavinski.me/debugging-rx-with-seq/ –

11

一つの重要なトリックが有効になって最初のチャンス例外とデバッグを再試行することで、これはあなたが代わりに再スロー1の本当の例外メッセージが表示されますことを、それは仕方可能性が高くなります:

+0

私は、人が最初のチャンスをキャッチするように設定された例外を実行しないと、いつも驚いています。飛行機のようなものです。 – scobi

+0

Rxは時間に依存することが多いため、ステップスルーはしばしばオプションではありません。トレースは、時間に敏感なデバッグに使用されます。 –

+0

この画面は、[デバッグ]> [例外]([オプション]以外)で使用できます。 https://msdn.microsoft.com/en-us/library/d14azbfh.aspx –

関連する問題