Как я отлаживаю тихие отказы в JAVA-приложениях?

Y-комбинатор реализует анонимную рекурсию. Таким образом, вместо

function fib( n ){ if( n<=1 ) return n; else return fib(n-1)+fib(n-2) }

вы можете выполнить

function ( fib, n ){ if( n<=1 ) return n; else return fib(n-1)+fib(n-2) }

, конечно, y-комбинатор работает только на языках вызовов по имени. Если вы хотите использовать это на любом обычном языке вызовов по значению, то вам понадобится соответствующий z-комбинатор (у-комбинатор будет расходиться / бесконечный цикл).

5
задан Hanno Fietz 24 June 2009 в 09:49
поделиться

4 ответа

Вы можете попробовать получить дамп потока - он сообщит вам, блокируются ли какие-либо методы (например, ожидание ввода). [Изменить: перечитайте свой исходный вопрос, получение дампа потока, вероятно, не поможет, поскольку похоже, что на самом деле ничего не блокирует. Но я оставляю его здесь, так как считаю его полезным во многих других ситуациях!]

Если вы считаете, что ошибка возникает в другом потоке, вы также можете установить UncaughtExceptionHandler , чтобы попытаться его отловить.

2
ответ дан 14 December 2019 в 01:14
поделиться

Если вы уверены, что проблема где-то в этом методе, вы можете попробовать посмотреть исходный код JAXB .

РЕДАКТИРОВАТЬ:

Хорошо, если становится действительно плохо, вы можете создать свою собственную частную копию с инструментами отладки. Надеюсь, вам не придется прибегать к этому.

1
ответ дан 14 December 2019 в 01:14
поделиться

возможно, внутри вызова происходит бесконечный цикл, и поэтому вы не продвигаетесь дальше, но это может не вызвать сбой (если память не используется в каждом цикле).

0
ответ дан 14 December 2019 в 01:14
поделиться

Наверное, очевидный вопрос, но уверены ли вы, что ловите Throwable? Непроверенное исключение может легко привести к смерти рассматриваемого потока (при условии, что никто выше вас в стеке вызовов тоже не поймает его.)

Поскольку вы приостанавливаете виртуальную машину при запуске с помощью аргументов отладки, я полагаю, вы подтвердили, что отладчик подключается правильно. Тот факт, что вы говорите, что отладчик пропускает вызов, очень подозрительный. Можете ли вы достичь каких-либо точек останова в этом приложении? А что насчет этого класса? А как насчет этой ветки?

Как вы сузили эту строку без отладчика? println / отладка в файл?

Можете ли вы вставить фрагмент кода рассматриваемого метода?

Вы можете подтвердить теорию о том, что поток умирает, создав второй поток до возникновения проблемы и присоединив его к потоку вы думаете, что умирает. Тогда метод run () второго потока будет вызываться при выходе из рассматриваемого потока, и вы будете знать, что он умер (но все равно не знаете почему).

В ответ на ваш общий вопрос, когда у меня есть ошибка в приложение Java, которое я не могу воспроизвести в отладчике (что случается время от времени по разным причинам), я постепенно изменяю свой код с помощью sysout printlns или вывода в файлы. Если необходимо, Я также могу изменить код, который вызывает мой код. Если у вас нет исходного кода для вызываемого кода, вы можете попробовать одну из многих структур BCI, чтобы внедрить свой байтовый код в рассматриваемые методы. Это утомительный процесс, но случается лишь изредка.

6
ответ дан 14 December 2019 в 01:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: