Как отладить проблемы с повреждением кучи JNI? - PullRequest
5 голосов
/ 15 марта 2011

У меня есть Java-приложение, которое вызывает множество различных нативных методов унаследованного приложения через JNI.Но JVM аварийно завершает работу с дампом стека в случайных местах вне любого вызова JNI.Иногда происходит сбой во время GC, иногда во время загрузки класса и других местах.Я подозреваю, что один или несколько собственных методов повреждают кучу JVM или некоторую другую структуру данных.Мне нужно знать, какой это вызов, чтобы я мог исправить нативную реализацию.

Устаревшее приложение - сторонняя DLL, для которой у меня нет ни источников, ни информации о символах.Чтобы сделать его вызываемым из Java, я создал оболочку DLL, которая использует соглашения о вызовах JNI.

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

Знаете ли вы что-нибудь, что может помочь?

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

1 Ответ

5 голосов
/ 13 мая 2011

Поскольку я вышел из ответов и не смог самостоятельно найти готовое решение, в итоге я создал процесс песочницы на чистом C ++ только для выявления проблемы. Мое Java-приложение создает экземпляр песочницы с помощью ProcessBuilder, а затем связывается с ним с помощью stdin и stdout. Вместо JVM, это песочница, которая на самом деле загружает и вызывает устаревшую DLL. Затем я наблюдал за процессом «песочницы» с помощью Microsoft Application Verifier, который обнаружил проблему с повреждением памяти - был вызов, передающий буфер меньше ожидаемого. После того, как это было идентифицировано, я просто увеличил длину байта [], используемого в качестве буфера в приложении Java, и теперь JVM может выполнять прямые вызовы DLL без использования песочницы.

В целом, я потерял почти 10 дней только потому, что у JVM нет возможности проверять кучу после каждого вызова JNI. Но, по крайней мере, сейчас, если кто-то обнаружит сбой, мы можем быстро отладить его с помощью песочницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...