Ứng dụng Java của tôi đã bắt đầu gặp sự cố thường xuyên với SIGSEGV và một đống dữ liệu ngăn xếp và tải thông tin trong một tệp văn bản.Làm cách nào để gỡ lỗi các Segfaults xảy ra trong JVM khi nó chạy mã của tôi?
Tôi đã gỡ lỗi chương trình C trong gdb và tôi đã gỡ lỗi mã Java từ IDE của mình. Tôi không chắc chắn làm thế nào để tiếp cận C-như tai nạn trong một chương trình Java đang chạy.
Tôi giả sử tôi không xem xét lỗi JVM tại đây. Các chương trình Java khác chạy tốt, và JVM từ Sun có lẽ ổn định hơn mã của tôi. Tuy nhiên, tôi không có ý tưởng làm thế nào tôi thậm chí có thể gây ra segfaults với mã Java. Có chắc chắn là đủ bộ nhớ có sẵn, và khi tôi cuối cùng kiểm tra trong hồ sơ, sử dụng đống là khoảng 50% với đột biến thường xuyên khoảng 80%. Có bất kỳ thông số khởi động nào tôi có thể điều tra không? Danh sách kiểm tra tốt khi tiếp cận một lỗi như thế này là gì?
Mặc dù tôi không thể tái tạo lại sự kiện một cách đáng tin cậy, nhưng nó dường như không xảy ra hoàn toàn ngẫu nhiên, vì vậy việc kiểm tra không hoàn toàn là không thể.
ETA:. Một số các chi tiết đẫm máu
(Tôi đang tìm kiếm một cách tiếp cận chung, kể từ khi vấn đề thực tế có thể là rất cụ thể Tuy nhiên, có một số thông tin tôi đã thu thập và mà bạn có thể Một số giá trị.)
Cách đây không lâu, tôi gặp sự cố tương tự sau khi nâng cấp máy chủ CI (xem here để biết thêm chi tiết), nhưng khắc phục (thiết lập -XX:MaxPermSize
) không giúp được. Điều tra sâu hơn cho thấy rằng trong các tệp nhật ký sự cố, chuỗi được đánh dấu là "chuỗi hiện tại" không bao giờ là một trong số của tôi, nhưng một trong hai được gọi là "VMThread" hoặc được gọi là "GCTaskThread" - tôi e nó là thứ hai. được đánh dấu bằng chú thích "(đã thoát)", nếu nó cũ, GCTaskThread không có trong danh sách. Điều này làm cho tôi giả sử rằng vấn đề có thể xảy ra ở phần cuối của một phép toán GC.
Bạn có thể nhận theo dõi ngăn xếp không? Có phải SEGV ở cùng một nơi không? Chúng ta có thể có thêm thông tin để làm việc không? –
Có bất kỳ mã gốc nào trong ứng dụng của bạn không? Nếu JVM cho phép bất kỳ bộ sưu tập bytecode nào, cho dù bytecode có lỗi đến mức nào, để kích hoạt một segfault, thì _ipso facto_ your're đang tìm kiếm một lỗi JVM (hoặc JRE). –
@Ed - Tôi có rất nhiều dấu vết ngăn xếp, nhưng đó là một bức tường lớn của văn bản. Phần nào sẽ hữu ích nhất để đăng? Tôi chủ yếu tìm kiếm một cách chung để tiếp cận loại vấn đề này, do đó tôi do dự để đổ một tải thông tin rất cụ thể ở đây. –