2011-11-22 16 views
24

Sto cercando idee su come rendere RX più facilmente eseguibile. Può essere molto difficile trovare il punto di fallimento quando una fonte viene passata attraverso i combinatori e le manette e pubblica e così via.Trucchi per il debug con le estensioni reattive?

Finora ho fatto cose simili a quello che faccio con le complicate catene Enumerable - inserendo Do() per tracciare, aggiungendo un campo "nome" ad un tipo anonimo in parte, acquisendo tracce dello stack a volte .. Ma abbiamo forse centinaia di produttori e forse migliaia di consumatori nel nostro sistema e sta diventando molto difficile isolare i problemi.

Quali tipi di trucchi avete per il debug del vostro uso RX?

+2

Grande domanda. Sto sempre lottando per eseguire il debug del mio codice Rx. – Tim

+7

Non sono assolutamente d'accordo con questa domanda che è stata chiusa casualmente da CasperOne. Sto cercando esperienza in una tecnologia molto specifica. Questa domanda * probabilmente * porterà a "opinione, dibattito, discussioni, sondaggi o discussioni estese". – scobi

+1

Non costruttivo? Forse la domanda non è abbastanza specifica, ma è una domanda molto preziosa. Oh bene, torniamo alle domande "perchè questo codice non compila". –

risposta

7

penso che un constructive discussion su questo argomento si è avuto sui Forum Rx nel 2009.

Invece di aggiungere ad hoc Do operatori nelle vostre domande, si dovrebbe aggiungere un operatore personalizzato Log/Trace. Questo operatore acquisisce gli eventi Subscription, Disposal, OnNext, OnError e OnCompleted. A seconda dell'implementazione, è sufficiente scrivere sulla console, utilizzare la libreria di Logger preferita o persino creare eventi ETW per l'integrazione di OS e 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

Prova questo + Seq http://www.lavinski.me/debugging-rx-with-seq/ –

11

Un trucco importante per la cattura di insetti Rx è per ritentare il debug con eccezioni first-chance abilitati, questo lo rende molto più probabile che si otterrà un messaggio di eccezione vero e proprio, invece di un rilanciati uno:

+0

Sono sempre sorpreso quando le persone non corrono con le eccezioni impostate per catturare la prima possibilità. È come volare cieco. – scobi

+0

Rx sono spesso dipendenti dal tempo, quindi passare spesso non è un'opzione possibile. Le tracce vengono utilizzate nel debug time-sensitive. –

+0

Chiarire, questa schermata è disponibile in Debug> Eccezioni (non in Opzioni). https://msdn.microsoft.com/en-us/library/d14azbfh.aspx –

Problemi correlati