как отлаживать jni dll

У меня есть небольшая Java-программа. Он загружает jni dll, и эта dll загружает обычную dll win32. Я хотел бы отладить, какие аргументы приложение Java в конце концов предоставляет одному конкретному вызову dll win32. Мой план состоял в том, чтобы поставить точку останова на этом вызове DLL в ollydbg, а затем проверить стек. Но я должен предоставить исполняемый файл, когда я запускаю режим отладки в ollydbg, поэтому единственный вариант, который у меня есть, - предоставить java.exe параметры для запуска моей java-программы. Но я могу установить точку останова в DLL только тогда, когда DLL в конечном итоге загружается, что требует от меня в основном запуска программы. Я не понимаю, как я не могу «остановить» выполнение, чтобы установить точку останова, и если бы я мог как-то остановить, мне не нужна была бы точка останова. Может ли кто-нибудь сказать мне, что мне нужно сделать?


person kaidentity    schedule 10.08.2016    source источник
comment
Какую IDE вы используете и какую версию IDE?   -  person JJF    schedule 10.08.2016
comment
Но я могу установить точку останова в DLL только тогда, когда DLL в конечном итоге загружается. Не правда. Не знаю о других IDE, но Visual Studio также сломается в ранее установленных точках останова.   -  person user2543253    schedule 11.08.2016
comment
@JFF: я пробовал ollydbg, но не могу загрузить DLL. Я должен начать с исполняемого файла. В противном случае я попробую Visual Studio Express Edition.   -  person kaidentity    schedule 14.08.2016


Ответы (1)


Вы можете дать указание отладчику прерываться при загрузке конкретной dll.

  • загрузить «java.exe» в Ollydbg
  • Перейдите в меню «Параметры > параметры» (ALT + O).
  • В окне параметров в левом меню перейдите в «Отладка > События».
  • Установите флажок «Пауза в новом модуле (DLL)».
  • (Необязательно) Отметьте «Только на следующих модулях» (иначе отладчик будет ломаться для всех загруженных модулей, включая системные).
  • Нажмите кнопку «Добавить» и заполните поле именем вашей dll.
  • Нажмите «ОК» в нижней части окна «Отладка событий».

введите здесь описание изображения

  • Перейдите в меню «Файл»> «Установить новые аргументы», если вы хотите передать некоторые аргументы в java.exe.
  • Перезапустите программу (CTRL+F2), это нужно для учета изменений.
  • Запустите программу, она должна сломаться, когда вы загружаете jni dll (на главной DLL).
  • Press "CTRL + N" to see the names exported by your DLL
    • note: you can actually type the name you are searching for on this window
    • это выглядит так (пример с системной DLL kernel32.dll, я набрал в окне "CreatefileW"):

введите здесь описание изображения

  • Нажмите F2 на имени функции, на которой вы хотите остановиться (это поставит точку останова на функцию)
  • Запустите программу с F9: если функция вызывается, это должно сломаться.
person Neitsa    schedule 15.08.2016
comment
@kaidentity Рад, что смог помочь! Также добавлена ​​точность Check "Only on the following modules" в окне событий. Если у вас есть время, дайте мне знать, если все работает как задумано. - person Neitsa; 15.08.2016
comment
@Neista: какую версию ollydbg вы используете? Я пробовал 10 и 20, и ни в одном я не могу указать, на каком модуле я хочу сделать паузу. - person kaidentity; 16.08.2016
comment
Мои точки останова не сработали. Могут ли точки останова несовместимы с паузой при загрузке модуля? - person kaidentity; 16.08.2016
comment
@kaidentity: нет, это должно работать нормально (у меня никогда не было проблем при установке BP, когда отладчик останавливается при загрузке модуля). Вы уверены, что функция (где вы устанавливаете точку останова) вызывается? Установка программной точки останова эквивалентна установке int3, она всегда будет обнаружена отладчиком (иначе все рухнет). У вас есть способ сделать отладочную печать из собственного кода? Возможно, вы захотите попробовать установить аппаратный BP, но я сомневаюсь, что это что-то изменит... - person Neitsa; 16.08.2016
comment
Работает сейчас. Я установил BP для всех соответствующих вызовов, и тогда это сработало, я получил информацию, которую искал, хотя я не могу сказать, что только отдаленно знаком с этим материалом... перезапуская java и ollydbg снова и снова.. . - person kaidentity; 16.08.2016