У нас есть приложение С++ со встроенным 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
, должен быть передан нашему сигналу. Правильно ли это при этом?
Кроме того, почему стек вызовов неполный? Я имею в виду, очевидно, что он не может показать мне java-код до socketWrite0
, но почему я не вижу стек перед java-кодом?