Câu hỏi Thủ thuật gỡ lỗi với Tiện ích mở rộng phản ứng?


Tôi đang tìm kiếm ý tưởng về cách làm cho RX dễ dàng gỡ lỗi hơn. Nó có thể rất khó khăn để tìm ra điểm thất bại khi một nguồn được truyền qua các combiners và throttles và publish và như vậy.

Cho đến nay tôi đã làm những việc tương tự với những gì tôi làm với chuỗi Enumerable phức tạp - chèn Do () để truy tìm, thêm một trường "tên" vào một phần kiểu vô danh thông qua, lấy dấu vết đôi khi .. Nhưng chúng ta có lẽ hàng trăm của các nhà sản xuất và có thể hàng ngàn người tiêu dùng trong hệ thống của chúng tôi và rất khó để cô lập các vấn đề.

Bạn có loại thủ thuật nào để gỡ lỗi việc sử dụng RX của mình?


26
2017-11-22 02:06


gốc


Câu hỏi tuyệt vời. Tôi luôn đấu tranh để gỡ lỗi mã Rx của mình. - Tim
Tôi mạnh mẽ không đồng ý với câu hỏi này bị casperOne đóng cửa một cách tình cờ. Tôi đang tìm kiếm chuyên môn trong một công nghệ rất cụ thể. Câu hỏi này sẽ không phải có thể dẫn đến "quan điểm, tranh luận, tranh luận, bỏ phiếu hoặc thảo luận mở rộng". - scobi
Không xây dựng? Có lẽ câu hỏi không đủ cụ thể, nhưng đó là một câu hỏi rất có giá trị. Ồ, quay lại câu hỏi "tại sao không biên dịch mã này". - Niall Connaughton
Đã bỏ phiếu để mở lại - Tom Bushell
Trong khi câu hỏi này có thể dẫn đến một số cuộc thảo luận, nó có vẻ như là một câu hỏi hợp lý. Người hỏi đề cập đến các kỹ thuật gỡ lỗi cụ thể mà anh ta đã cố gắng và vạch ra lý do tại sao họ không đủ trong các trường hợp cụ thể. Người ta sẽ hy vọng câu trả lời cho câu hỏi này sẽ liệt kê các kỹ thuật gỡ lỗi được chứng minh bổ sung, mà sẽ mang lại lợi ích cho độc giả của trang web này. Bỏ phiếu để mở lại. @Scott Bilas: Tôi nghĩ rằng nó sẽ cải thiện câu hỏi nếu bạn có thể làm rõ lý do tại sao trong trường hợp cụ thể của bạn về hoàn cảnh các kỹ thuật đã cố gắng làm cho nó "rất khó để cô lập vấn đề". - njuffa


Các câu trả lời:


Tôi nghĩ một thảo luận mang tính xây dựng về chủ đề này đã có trên Diễn đàn Rx năm 2009.

Thay vì thêm adhoc Do các toán tử vào các truy vấn của bạn, bạn sẽ thêm một toán tử Log / Trace tùy chỉnh. Toán tử này sẽ nắm bắt các sự kiện Đăng ký, Hủy bỏ, OnNext, OnError và OnCompleted. Tùy thuộc vào việc thực hiện của bạn, nó chỉ có thể ghi vào bàn điều khiển, sử dụng thư viện Logger yêu thích của bạn hoặc thậm chí tạo các sự kiện ETW cho OS và tích hợp 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(); };
        });
    }
}

7
2018-06-22 08:54



Hãy thử điều này + Seq lavinski.me/debugging-rx-with-seq - Daniel Little


Một thủ thuật quan trọng để bắt lỗi Rx là thử lại gỡ lỗi với các ngoại lệ cơ hội đầu tiên được kích hoạt, điều này làm cho nó có nhiều khả năng là bạn sẽ nhận được một thông báo ngoại lệ thực sự thay vì một thông báo bị gỡ xuống:


11
2017-11-22 05:08



Tôi luôn luôn ngạc nhiên khi mọi người không chạy với các ngoại lệ được thiết lập để nắm bắt cơ hội đầu tiên. Nó giống như bay mù. - scobi
Rx thường phụ thuộc vào thời gian để bước qua thường không phải là một lựa chọn. Dấu vết được sử dụng trong gỡ lỗi thời gian nhạy cảm. - Vadim Chekan
Làm rõ, màn hình này có sẵn trong Debug> Exceptions (không có trong Options). msdn.microsoft.com/en-us/library/d14azbfh.aspx - Jeson Martajaya