2012-06-26 27 views
9

Tôi có dịch vụ cửa sổ thực hiện một số công việc chuyên sâu mỗi phút (thực tế nó bắt đầu một chuỗi mới mỗi lần đồng bộ hóa với các hệ thống khác nhau trên http). Vấn đề là, sau một vài ngày đột nhiên dừng lại mà không có thông báo lỗi.Dịch vụ Windows/Trang bảo vệ mới cho ngăn xếp không thể được tạo

Tôi có NLog tại chỗ và tôi đã đăng ký 'AppDomain.CurrentDomain.UnhandledException'. Mục nhập cuối cùng trong textfile-log chỉ là một mục nhập bình thường mà không có bất kỳ vấn đề nào. Nhìn vào EventLog, tôi cũng không thể tìm thấy bất kỳ thư nào trong nhật ký ứng dụng, tuy nhiên, có hai mục nhập trong nhật ký hệ thống.

Về cơ bản, dịch vụ đã bị chấm dứt đột ngột. Chỉ có bấy nhiêu thôi. Sự kiện thứ hai (cùng lúc với sự kiện đầu tiên) cho biết: "... Không thể tạo trang bảo vệ mới cho ngăn xếp ..."

Từ những gì tôi đã đọc, đây có thể là lỗi tràn ngoại lệ. Tôi không phân tích cú pháp bất kỳ XML nào và tôi không làm công việc đệ quy. Tôi lưu trữ một máy chủ web bằng cách sử dụng Gate, Nancy và SignalR và có RavenDB đang chạy trong chế độ nhúng. Mỗi phút một nhiệm vụ mới được bắt đầu bằng cách sử dụng Taskfactory từ .NET 4.0 và tôi cũng có một ContinueWith nơi tôi khởi động lại System.Timers.Timer để kích hoạt lại sau một phút.

Tôi làm cách nào để bắt đầu điều tra vấn đề này? Điều gì có thể là lý do có thể cho một lỗi như vậy?

+3

Có, đó là SO. Nó không được quản lý mã, nó báo cáo ngoại lệ khác nhau. Bạn có một loạt mã bạn không viết, tất cả đều là nghi ngờ. –

Trả lời

9

Dựa trên những thông tin mà bạn cung cấp, tôi sẽ ít nhất, ở mức tối thiểu, làm như sau:

  1. Pay thêm sự chú ý cho bất kỳ cuộc gọi của bên thứ ba, và thêm thông tin bổ sung đăng nhập xung quanh các điểm này.
  2. Có một số trường hợp trong đó AppDomain.CurrentDomain.UnhandledException sẽ không giúp bạn - một StackOverflowException là một trong số đó. Tôi tin rằng CLR chỉ đơn giản là sẽ cung cấp cho bạn một chuỗi trong trường hợp này thay vì một dấu vết ngăn xếp.
  3. Chú ý thêm các khu vực có nhiều hơn một sợi được giới thiệu.

Một ví dụ về thường bị bỏ qua StackOverflowException là:

private string myString; 
public string MyString { get { return MyString; } } //should be myString 
+1

Cảm ơn câu trả lời của bạn! Tôi sẽ cố gắng loại bỏ Task.New.ContinueVới điều đó và xem điều đó có tạo nên sự khác biệt nào không. Một câu hỏi - nó cũng có thể là một System.OutOfMemoryException? –

+1

@DanielLang: Vâng, điều đó cũng có thể xảy ra. –

+0

@BryanCrosby là nó có thể nhận được một System.OutOfMemoryException và không nhận được nó đăng nhập cụ thể trong phần Appliaction của người xem sự kiện? –

2

Cũng giống như một 'cho những gì nó có giá trị' - trong trường hợp của tôi lỗi này đã được báo cáo khi mã đã cố gắng để viết thư cho Windows Nhật ký sự kiện và người dùng tương tác không có đủ quyền. Đây là một ứng dụng giao diện điều khiển nhỏ ghi lại các ngoại lệ đối với tệp văn bản và nhật ký sự kiện (nếu muốn). Trên ngoại lệ, tệp văn bản đã được cập nhật nhưng sau đó lỗi này đã được ném và không bị xử lý lỗi. Việc tắt Ghi nhật ký sự kiện đã ngừng xảy ra lỗi.

0

Chỉ trong trường hợp bất kỳ người nào khác có cùng một vấn đề, trong trường hợp của tôi, tôi thấy rằng dịch vụ cửa sổ của tôi đã bị mắc kẹt trong một vòng lặp đệ quy vô tận một cách vô tình. Vì vậy, nếu có ai khác có vấn đề này, hãy xem xét các cuộc gọi phương thức có thể gây ra các vòng lặp đệ quy rất lớn.

Các vấn đề liên quan