Цепочка сигналов JVM SIGPIPE

У нас есть приложение C ++ со встроенной JVM (Sun). Поскольку мы регистрируем собственные обработчики сигналов, рекомендуется сделать это перед инициализацией JVM, поскольку она устанавливает свои собственные обработчики ( см. Здесь ).

Насколько я понял, JVM внутренне знает, был ли сигнал источником из собственного кода, а если нет, то передает его по цепочке - нашим обработчикам.

Мы начали видеть, что получаем SIGPIPE, со стеком вызовов, который выглядит примерно так (верхняя запись - наш обработчик сигнала):

/.../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]

Похоже, что JVM решает, что SIGPIPE, который был вызван из send , должен быть передан нашему сигналу hander. Правильно ли это при этом?

Кроме того, почему стек вызовов неполный? Я имею в виду, что, очевидно, он не может показать мне Java-код до socketWrite0 , но почему я не вижу стек до Java-кода?

14
задан wnoise 10 November 2010 в 22:26
поделиться