отладить dll из java java-> jni.dll -> app.dll -> app.dll - PullRequest
5 голосов
/ 11 декабря 2008

как я могу отладить DLL, которая не загружена приложением Java.

Сценарий таков: мое java-приложение загружает jni.dll, которая использует другую dll, а эта dll использует другую dll.

java <-> jni.dll <-> dll <-> dll

У меня есть исходный код для всех модулей

Я использую Visual Studio Express при отладке jni.dll, но что мне делать, чтобы иметь возможность отлаживать другие библиотеки?

Ответы [ 5 ]

8 голосов
/ 12 декабря 2008

но это то же самое.

Я делаю то же самое, поэтому позвольте мне объяснить мой рабочий набор.

Я использую eclipse 3.1 и Visual C ++ 2003 7.1.3088 (немецкий ... извините;)) и Windows XP. Я загружаю some_jni.dll и some.dll в Java и с помощью классов jni. some.dll загружает внутренние другие .dll. Я могу отладить some.dll и другие .dll в Visual Studio.

Запустите ваше приложение и установите точку останова для первого вызова класса jni. Откройте VS и перейдите (на немецком языке) к «Debuggen» (Отладка) -> «Prozesse» (Процессы) Их вы увидите javaw.exe

Выберите javaw.exe и нажмите «Anfügen» (Вложить).

Когда я вспоминаю, кодовая страница в c ++, где размещается точка останова, должна быть открыта в VS. VS не откроет страницу, когда точка останова будет нажата автоматически. Когда dll загружен и строка кода, в которую вы поместили точку останова, выполняется, отладчик в VS остановится в этой позиции. Обратите внимание: это произойдет только тогда, когда вы скомпилируете dll, в котором хотите отлаживать, с параметрами отладки !!! в противном случае отладчик не остановится на точке останова C ++.

Я сделал это полгода назад, но это должны быть правильные шаги.

Надеюсь, вы его получите.

1 голос
/ 11 декабря 2008

В Visual Studio вы можете адаптировать отладчик к работающему Java-процессу. При достижении точки останова в коде C ++ отладчик покажет это в Visual Studio и остановит процесс.

На данный момент у меня не установлено Visual Studio, но в опциях отладки есть окно, где вы можете увидеть все запущенные процессы. Найдите процесс java и добавьте его в сеанс отладки.

Когда dll выполнит строку, в которой находится точка останова, вы увидите ее.

EDIT: Вы должны компилировать с отладочной информацией, а не в режиме выпуска, иначе отладчик в Visual Studio не остановится на точке останова!

0 голосов
/ 06 февраля 2010

Один грубый способ сделать это создать бесконечный цикл в DLL, который вы хотите отладить как:

int x = 1;<br> while(x);

Как только приложение Java входит в этот цикл, присоедините его к этому процессу через отладчик и установите значение x в 0, чтобы разорвать цикл, и теперь вы можете пройти через отладчик.

0 голосов
/ 13 мая 2009

В качестве альтернативы попробуйте IKVM. http://www.ikvm.net/

0 голосов
/ 11 декабря 2008

Прошло много времени с тех пор, как я это делал в последний раз, и даже тогда это было в Linux и Solaris. Неполное решение состоит в том, чтобы встроить «жестко запрограммированные точки останова» в вашу DLL с помощью «_asm int 3;»

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

Это не так гладко, как указание отладчику на известный идентификатор процесса, но оно должно помочь вам.

М.

...