У меня есть небольшая Java-программа. Он загружает jni dll, и эта dll загружает обычную dll win32. Я хотел бы отладить, какие аргументы приложение Java в конце концов предоставляет одному конкретному вызову dll win32. Мой план состоял в том, чтобы поставить точку останова на этом вызове DLL в ollydbg, а затем проверить стек. Но я должен предоставить исполняемый файл, когда я запускаю режим отладки в ollydbg, поэтому единственный вариант, который у меня есть, - предоставить java.exe параметры для запуска моей java-программы. Но я могу установить точку останова в DLL только тогда, когда DLL в конечном итоге загружается, что требует от меня в основном запуска программы. Я не понимаю, как я не могу «остановить» выполнение, чтобы установить точку останова, и если бы я мог как-то остановить, мне не нужна была бы точка останова. Может ли кто-нибудь сказать мне, что мне нужно сделать?
как отлаживать jni dll
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
@kaidentity Рад, что смог помочь! Также добавлена точность
Check "Only on the following modules"
в окне событий. Если у вас есть время, дайте мне знать, если все работает как задумано.
- person Neitsa; 15.08.2016
@Neista: какую версию ollydbg вы используете? Я пробовал 10 и 20, и ни в одном я не могу указать, на каком модуле я хочу сделать паузу.
- person kaidentity; 16.08.2016
Мои точки останова не сработали. Могут ли точки останова несовместимы с паузой при загрузке модуля?
- person kaidentity; 16.08.2016
@kaidentity: нет, это должно работать нормально (у меня никогда не было проблем при установке BP, когда отладчик останавливается при загрузке модуля). Вы уверены, что функция (где вы устанавливаете точку останова) вызывается? Установка программной точки останова эквивалентна установке int3, она всегда будет обнаружена отладчиком (иначе все рухнет). У вас есть способ сделать отладочную печать из собственного кода? Возможно, вы захотите попробовать установить аппаратный BP, но я сомневаюсь, что это что-то изменит...
- person Neitsa; 16.08.2016
Работает сейчас. Я установил BP для всех соответствующих вызовов, и тогда это сработало, я получил информацию, которую искал, хотя я не могу сказать, что только отдаленно знаком с этим материалом... перезапуская java и ollydbg снова и снова.. .
- person kaidentity; 16.08.2016