Chúng tôi có một ứng dụng C++ với một JVM được nhúng (Sun's). Bởi vì chúng tôi đăng ký các trình xử lý tín hiệu của riêng mình, chúng tôi khuyên bạn nên làm như vậy trước khi khởi tạo JVM vì nó cài đặt các trình xử lý riêng của mình (see here).Chùm tín hiệu JVM SIGPIPE
Từ những gì tôi hiểu, JVM biết nội bộ nếu tín hiệu có nguồn gốc từ mã riêng của nó và nếu nó không truyền nó dọc theo chuỗi - đến bộ xử lý của chúng tôi.
Những gì chúng ta bắt đầu nhìn thấy là chúng ta đang nhận được SIGPIPEs, với một chồng gọi đó trông gần như thế này (mục trên cùng là xử lý tín hiệu của chúng tôi):
/.../libos_independent_utilities.so(_ZN2os32smart_synchronous_signal_handlerEiP7siginfoPv+0x9) [0x2b124f7a3989]
/.../jvm/jre/lib/amd64/server/libjvm.so [0x2aaaab05dc6c]
/.../jvm/jre/lib/amd64/server/libjvm.so [0x2aaaab05bffb]
/.../jvm/jre/lib/amd64/server/libjvm.so(JVM_handle_linux_signal+0x718) [0x2aaaab05e878]
/.../jvm/jre/lib/amd64/server/libjvm.so [0x2aaaab05bf0e]
/lib64/libpthread.so.0 [0x3c2140e4c0]
/lib64/libpthread.so.0(send+0x91) [0x3c2140d841]
/.../jvm/jre/lib/amd64/libnet.so [0x2aaabd360269]
/.../jvm/jre/lib/amd64/libnet.so(Java_java_net_SocketOutputStream_socketWrite0+0xee) [0x2aaabd35cf4e]
[0x2aaaaeb3bf7f]
Nó có vẻ như JVM là quyết định mà SIGPIPE được nâng lên từ send
nên được chuyển đến bộ xử lý tín hiệu của chúng tôi. Có đúng khi làm như vậy không?
Ngoài ra, tại sao ngăn xếp cuộc gọi không đầy đủ? Tôi có nghĩa là rõ ràng nó không thể hiển thị cho tôi mã java trước socketWrite0
nhưng tại sao tôi không thể nhìn thấy ngăn xếp trước mã java?
Bạn đã cài đặt bộ xử lý tín hiệu cho SIGPIPE chưa? (nếu có, có - thông thường bạn sẽ nhận được SIGPIPE từ các cuộc gọi send() khi ai đó ghi vào một ổ cắm bị hỏng) – nos
Tôi biết rằng 'send' có thể tăng SIGPIPE. Tôi chỉ đơn thuần đặt câu hỏi về quyết định của JVM để chuyển chúng cho tôi, tại sao nó không đưa ra một ngoại lệ? –
Nhưng bạn đã không cài đặt một trình xử lý cho nó? – nos