У нас возникла проблема, когда наша JVM (HotSpot on Weblogic) заканчивается фатальной ошибкой.
SIGSEGV (0xb) at pc=0xffffffff7a045f1c
Мы проанализировали и повторно проанализировали фатальные журналы ошибок (Oracle: Fatal Error Log Troubleshooting). Журнал ошибок включает поток, выполняющийся во время ошибки и ее трассировки (первые три строки ниже, считывая трассировку). Трассировка одинакова при каждом возникновении фатальной ошибки.
J com.bea.wsrp.producer.container.ServletRequestImpl.setHeaders(Ljava/util/Map;Ljava/util/LinkedHashMap;Ljava/lang/String;)V
j com.bea.wsrp.producer.container.RequestFactory.createServletRequest(Ljavax/servlet/http/HttpServletRequest;Lcom/bea/wsrp/model/markup/IRuntimeContext;Lcom/bea/wsrp/model/markup/IMarkupParams;Lcom/bea/wsrp/producer/handlers/ServiceHandler$InvocationType;)Lcom/bea/wsrp/producer/container/ServletRequestImpl;+213
j com.bea.wsrp.producer.container.RequestFactory.createServletRequest(Ljavax/servlet/http/HttpServletRequest;Lcom/bea/wsrp/model/markup/IRuntimeContext;Lcom/bea/wsrp/model/markup/IMarkupParams;Lcom/bea/wsrp/model/markup/state/IOpaqueState;Lcom/bea/wsrp/model/markup/INavigationalContext;Lcom/bea/wsrp/producer/handlers/ServiceHandler$InvocationType;)Lcom/bea/wsrp/producer/container/ServletRequestImpl;+5
Мой вопрос заключается в том, что, учитывая трассировку стека и наш исходный код, как мы можем вычислить необходимое действие (или раздел кода для более тщательного тестирования), чтобы воссоздать эту проблему, когда последняя часть нашего кода, который работает, составляет ~ 80 строк вниз trace и довольно общий (что означает, что через него проходит много разных действий)? Существуют ли какие-либо статические методы анализа кода, которые могут помочь? Может ли поиск по байт-коду помочь? Или мы застреваем без доступа к источнику поставщика?
Пробное тестирование и тестирование ошибок (включая наши стандартные рабочие/функциональные скрипты) не смогли воссоздать проблему или даже использовать метод setHeaders (верхняя строка вышеуказанного трассировки).
Спасибо за любую помощь по новому пути решения этой проблемы.
Если вы имеете в виду воссоздать одно и то же состояние потока, которое вы не знаете, что было, когда оно умерло, вы можете использовать Thread.currentThread().setName(...)
Некоторые люди используют это, чтобы установить информацию о состоянии потока в имени потока, чтобы позднее анализ дампа стека мог дать вам некоторую информацию о состоянии, например, имя потока может быть примерно таким:
thread [abc] values [tx=1234, state=state1, user=someuser, starttime=123456]