2011-11-22 15 views
24

Szukam pomysłów, jak sprawić, aby RX był łatwiejszy do debugowania. Może być bardzo trudno znaleźć punkt awarii, gdy źródło przechodzi przez kombinatory i przepustnice i publikuje i takie.Sztuczki do debugowania za pomocą rozszerzeń reaktywnych?

Do tej pory robiłem podobne rzeczy do tego, co robię ze skomplikowanymi łańcuchami Enumerable - wstawianie Do() do śledzenia, dodawanie pola "name" do anonimowego typu przez część czasu, chwytanie śladów stosu czasami .. Ale w naszym systemie jest prawdopodobnie setki producentów, a może tysiące konsumentów i bardzo trudno jest wyodrębnić problemy.

Jakie masz sztuczki do debugowania twojego użytkowania RX?

+2

Świetne pytanie. Zawsze staram się debugować mój kod Rx. – Tim

+7

Zdecydowanie nie zgadzam się z tym, że pytanie to jest casperOne zamknięte. Szukam wiedzy w bardzo konkretnej technologii. To pytanie * nie * prawdopodobnie doprowadzi do "opinii, debaty, argumentów, sondowania lub rozszerzonej dyskusji". – scobi

+1

Nie jest konstruktywny? Być może pytanie nie jest wystarczająco szczegółowe, ale jest to bardzo cenne pytanie. No cóż, wracając do pytań "dlaczego ten kod się nie kompiluje". –

Odpowiedz

7

myślę, że constructive discussion na ten temat została miał na forum Rx w 2009.

Zamiast dodawania AdHoc Do operatorów w zapytaniach, należy dodać operator zwyczaj Log/śladowych. Ten operator przechwyci zdarzenia subskrypcji, utylizacji, OnNext, OnError i OnCompleted. W zależności od implementacji może po prostu pisać do konsoli, używać swojej ulubionej biblioteki Logger, a nawet tworzyć zdarzenia ETW dla integracji systemu operacyjnego i Visual Studio.

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

Spróbuj tego + Seq http://www.lavinski.me/debugging-rx-with-seq/ –

11

Jeden ważny trik do łapania błędów RX, aby ponowić próbę debugowania pierwszy szansy wyjątkami włączone, to sprawia, że ​​o wiele bardziej prawdopodobne, że dostaniesz wiadomość prawdziwy wyjątek zamiast rethrown jednym:

+0

Zawsze jestem zaskoczony, gdy ludzie nie biegają z wyjątkami ustawionymi na złapanie pierwszej szansy. To jak latanie w ciemno. – scobi

+0

Rx są często zależne od czasu, więc często nie jest to możliwe. Ślady są używane w debugowaniu zależnym od czasu. –

+0

Wyjaśnienie, ten ekran jest dostępny w sekcji Debugowanie> Wyjątki (nie w Opcjach). https://msdn.microsoft.com/en-us/library/d14azbfh.aspx –

Powiązane problemy