Добрый вечер! Как в иде узнать адрес предыдущей выполенной инструкции или сделать шаг назад? Нпример ида вываливается на каком то адресе типа память не может быть прочитана, а как узнать какая инструкция предшествовала той на которой застопорился процесс? Спасибо
Шаг назад -- клавиша Esc. Только не помню, работает ли она для исключений. Для исключений можно попробовать посмотреть в стеке на структуру CONTEXT, которая передается обработчику исключений. В ней живет значение регистра eip.
не работает. esc - это шаг назад в буфере перемещений юзера. Т.е. кликнул по адресу - ушел туда. esc - вернулся назад.
deadly83 Не, это называется обратная трассировка и ее сейчас нет в современных мейнстримных отладчиках.
В описании исключения есть вся необходимая информация (адрес инструкции, адрес памяти, флаг чтения/записи). А так - аппаратная поддержка этого есть, но отладчики режима пользователя её не используют.
Я думаю, можно написать скрипт, который будет вытаскивать необходимую информацию и ставить курсор на провинившуюся инструкцию. Но, если честно, сам еще не пробовал.
Таки попробовал. При живом отладчике (только при живом!) надо выполнить след. скрипт: Код (Text): auto addr, context; context = ecx; addr = Dword(context + 0xB8); Message("%x", addr); Когда IDA спросит "Отдать ли исключение программе?" ответить 'Yes'. Мы окажемся в ф-ии KiUserExceptionDispatcher. В ecx лежит адрес CONTEXT в котором прописан eip. Извлекаем eip из CONTEXT и выводим на экран. К сожалению, ф-ии, которая ставит курсор по заданному адресу я не нашел. Саму ф-ию можно выделить в .idc файл и вызывать по требованию. Для файла ф-ия будет выглядеть так: Код (Text): static get_excpt_addr() { auto addr, context; context = ecx; addr = Dword(context + 0xB8); Message("%x", addr); }
jump(ea). Да, жаль, что плагину даётся мало информации об исключении (только код и "Possible address referenced by the exception"), по идее, можно было бы обойтись средствами плагина для получения информации об исключении до захода в KiUserExceptionDispatcher.