2009-07-15 20 views
9

Tôi có một ứng dụng đang lưu trữ một số mã không ổn định của bên thứ ba mà tôi không thể kiểm soát trong một quy trình bên ngoài để bảo vệ ứng dụng chính của tôi khỏi các lỗi khó chịu. Quá trình cha mẹ của tôi là giám sát quá trình khác và làm "điều đúng (tm)" khi nó không thành công.Vô hiệu hóa báo cáo lỗi Windows (Dr. Watson) cho quy trình của tôi

Vấn đề mà tôi có là Dr. Watson vẫn phát hiện sự cố trong quá trình bị cô lập và gắn vào các quy trình trên đường xuống để lấy một bãi chứa sự cố. Điều này có hai vấn đề sau: 1. Giảm đáng kể thời gian cần thiết để tôi phát hiện lỗi do quá trình này vẫn còn hoạt động trong khi bãi chứa sự cố đang được thực hiện. 2. Hiển thị cửa sổ bật lên gây phiền nhiễu cho người dùng hỏi xem họ có muốn gửi báo cáo lỗi cho Microsoft hay không.

Rõ ràng là tôi muốn sửa các lỗi trong quá trình con, nhưng vì nó không phải là một tùy chọn, tôi muốn có khả năng vô hiệu hóa chọn lọc Dr. Watson (và Windows Error Reporting in Vista +) cho quá trình đó .

Tôi đang chạy một số mã của riêng mình trong quá trình trước khi chuyển sang bit không tin cậy, vì vậy nếu có API mà tôi có thể gọi ảnh hưởng đến quy trình hiện tại sẽ ổn.

Tôi biết: http://support.microsoft.com/default.aspx/kb/188296 sẽ tắt Dr. Watson cho toàn bộ máy. Tôi không muốn làm điều đó bởi vì nó sẽ làm cho tôi trở thành một công dân xấu trong thùng rác.

Tôi cũng biết tùy chọn WerSetFlags trong Vista + có vẻ như vô hiệu hóa báo cáo lỗi cửa sổ cho quy trình hiện tại, nhưng tôi cần một thứ sẽ tắt Dr.Watson trên các phiên bản hệ điều hành trước đó.

Trả lời

2

Các bác sĩ giỏi được gọi khi một quá trình không xử lý một ngoại lệ nhất định. Vì vậy, cách phổ biến để đi sẽ là xử lý tất cả các trường hợp ngoại lệ. Trong trường hợp của bạn, nó là khó khăn hơn nhiều kể từ khi bạn không sở hữu mã quá trình đâm. Những gì bạn có thể làm sau đó, là để tiêm mã của bạn vào quá trình khác trong thời gian chạy, và cài đặt một xử lý ngoại lệ mà sẽ nuốt các ngoại lệ gây ra vụ tai nạn. Khi bị bắt, hãy tắt quy trình một cách duyên dáng.

Có một vài câu hỏi ở đây nói về việc tiêm mã vào một quy trình khác. Đối với trình xử lý sự cố, bạn có thể set an unhandled exception filter hoặc add a vectored exception handler. Lưu ý rằng sau này, bạn sẽ phải cẩn thận không nuốt các ngoại lệ hợp pháp trong thực tế được xử lý bên trong quá trình khác, cụ thể là tìm cách nhận ra ngoại lệ bị lỗi và đảm bảo đó là trường hợp duy nhất bạn xử lý.

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