2012-07-04 30 views
7

Tôi có một ứng dụng Java 1.6 truy cập mô-đun gốc của bên thứ ba, thông qua lớp JNI được cung cấp làm giao diện. Gần đây, chúng tôi nhận thấy rằng SEGFAULT đang xảy ra trong mô-đun gốc và đang khiến ứng dụng của chúng tôi gặp sự cố. Có thể nắm bắt và xử lý sự kiện này, ít nhất là để đăng nhập nó đúng cách trước khi chết?Có thể xử lý SEGFAULT orginating trong mã gốc không?


Tôi đã thử cả hai kỹ thuật Java trong bài viết từ kjp's answer. Không làm việc. Cố gắng cài đặt một signal handler trên kết quả 'SEGV' trong ngoại lệ

tín hiệu đã được sử dụng bởi VM: SEGV

Các shutdown handler Tôi đã cài đặt đơn giản thất bại trong việc sa thải, có lẽ vì những gì các IBM article trạng thái:

móc Shutdown sẽ không thể chạy nếu phương pháp

Runtime.halt() được gọi chấm dứt JVM. Runtime.halt() được cung cấp để cho phép tắt nhanh JVM.
Tùy chọn JVM -Xrs được chỉ định.
JVM thoát bất thường, chẳng hạn như điều kiện ngoại lệ hoặc hủy bỏ cưỡng bức do phần mềm JVM tạo ra.

+0

Biểu tượng gỡ lỗi công khai có sẵn cho mã gốc không? Nếu bạn có thể tìm hiểu thêm về lý do tại sao nó xảy ra, bạn có thể gửi báo cáo lỗi toàn diện đủ để giúp họ sửa thư viện của họ. – Benj

+0

@Benj Làm việc trên điều đó song song. Họ sẽ nhận được nhiều thông tin hơn họ muốn. Đã hy vọng có một kế hoạch dự phòng. –

+0

Bạn đang chạy hệ điều hành nào? – Benj

Trả lời

2

Nếu tất cả những gì bạn muốn làm là ghi nhật ký và thông báo cho bạn có thể viết tập lệnh chạy ứng dụng của bạn. Khi ứng dụng chết, kịch bản có thể phát hiện xem các ứng dụng chấm dứt bình thường và từ tập tin hs_errXXXX trong đó có tất cả các vụ tai nạn/thông tin SEGV và gửi nó cho một ai đó (và khởi động lại ứng dụng nếu bạn muốn)


gì bạn cần làm là chạy mã JNI bị lỗi trong một JVM khác và liên lạc với JVM đó bằng RMI hoặc JMS hoặc Sockets. Bằng cách này khi thư viện chết, nó sẽ không làm giảm ứng dụng chính của bạn và bạn có thể khởi động lại nó.

+1

Một số ý nghĩa hiệu suất đáng kể khi thực hiện điều này ... Nó phải là lựa chọn duy nhất còn lại để cám dỗ tôi đi theo con đường này. – Benj

1

Dựa trên vài tuần nghiên cứu vào thời điểm đó, cũng như các cuộc hội thoại với các kỹ sư JVM tại hội nghị, điều này là không thể. Hệ thống sẽ không cho phép bạn cài đặt SignalHandler trên tín hiệu SEGV.

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