Как генерировать аварийные дампы для кода JNI - PullRequest
3 голосов
/ 25 августа 2011

все

Предположим, у меня есть простая программа JNI в Windows:

int* p = NULL;
*p = 5;

Когда он запускается из JVM, а не как обычное приложение C ++, JVM приятно ловит такое сложное исключение и выполняет некоторую работу по очистке.

Проблема в том, что она также мешает мне генерировать аварийные дампы прямо там, хотя есть опция JVM: -XX: OnError, но дампы ядра, сгенерированные в этот момент, находятся далеко от места преступления, поэтому их трудно отлаживать.

JVM переносит каждый поток Java с помощью SEH:

__try
{
    thread.run()
}
__except(topLevelExceptionFilter())
{
}

Код JNI, вызывающий нарушение прав доступа, происходит в thread.run, но обрабатывается в topLevelExceptionFilter, который уже находится где-то еще.

У вас есть предложения?

Спасибо.

Ответы [ 3 ]

6 голосов
/ 18 ноября 2011

Вы можете использовать параметр OnError, чтобы запустить собственный отладчик, например:

http://download.oracle.com/javase/7/docs/webnotes/tsg/TSG-VM/html/clopts.html#gbmum

java -XX:OnError="gdb - %p" MyApplication

Для Windows

Существует также опция -XX:+ShowMessageBoxOnError или -XX:+UseOSErrorReporting для JDK7, не уверен, что она работает для дампов ядра Linux, она должна работать для Windows и отладчика ОС по умолчанию (DrWatson). См http://blogs.oracle.com/poonam/entry/more_on_windows_crash_dumps

5 голосов
/ 25 августа 2011

A core - это аварийный дамп C ++ ... у вас нет удобных средств, которые предоставляет Java, чтобы упростить работу. Если вы скомпилировали свой собственный код для сохранения символов (и в идеале, чтобы не оптимизировать), вы можете использовать gdb или другой отладчик для его анализа и получения трассировки стека в точке сбоя, а также чтения переменных и т. Д.

core dumps generated at this point is far from the crime scene thus hard to debug - основные свалки совсем не «далеки от места преступления», они полностью охватывают так называемое место преступления. Единственная причина, по которой вы думаете, что их трудно отлаживать, это то, что вы еще не узнали ... но они определенно являются подходящим инструментом для этой работы.

0 голосов
/ 30 декабря 2014

В Linux используйте ulimit -c unlimited для создания дампа ядра. Затем используйте gdb для отладки файла ядра с помощью процесса Java.

...