2015-05-14 2 views
4

Учитывая начальное состояние управляемой пользователем программы в памяти, можем ли мы записать инструкции, данные для процессора, перезагрузить программу в ее исходное состояние и воспроизвести инструкции процессора и запустить программу, как это было при использовании пользователем , без пользователя?Можем ли мы записать инструкции, данные для процессора?

Прошу прощения, если этот вопрос плохо написан или запутан.

+1

Какова цель вашего вопроса? Отладка? Тестирование? Моделирование? Все возможно, но все решения различаются. Если вы дадите дополнительную информацию, мы можем предложить лучшую помощь :-) – Klaus

ответ

1

Скорее всего! Можно выполнить программу в инструкции по отладчику по инструкции. Вам также придется записывать инструкции в той или иной форме, хотя исходный код или исполняемый файл программы могут работать так же хорошо.

Некоторые программы, например, хранить такие файлы, как сетевые журналы или журналы действий, чтобы сохранить состояние программы в определенный момент времени. Базы данных также могут хранить важную информацию, которая также может быть просмотрена, когда программа «не работает». Что-то простое, как журнал, может быть полезно для записи ввода в программу.

Для выполнения инструкций вы должны использовать команды nexti и stepi в GDB, чтобы выполнить инструкцию по инструкции. Мы также можем использовать disassemble, чтобы получить инструкции по сборке, которые должны хорошо сочетаться с отдельными инструкциями CPU. Также должны быть аналоги в LLDB и отладчике MSVC.

И теперь, для моего примера «состояния управляемого пользователя программы в памяти:»

enter image description here

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

Можно предположить, что дамп физической памяти можно использовать для определения проблем с системой в данный момент времени и из-за сбоя операционной системы.

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

Похожие: http://www.unknownroad.com/rtfm/gdbtut/gdbadvanced.html#STEPI

2

Если пользователь не взаимодействует с программой, и вы не сохранили историю входов (или другой формы взаимодействия), то ответ, конечно, нет.

Полное выполнение трассировки может быть огромным (1 Giga инструкций в секунду ...)

0

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

Я понятия не имею, что есть какой-либо инструмент, который может читать такую ​​трассировку и вести себя как оригинальная программа.

Для запуска программы с использованием имитируемого пользовательского ввода является другой частью, но не имеет ничего общего с вашей идеей. Здесь ввод (-ы) программы будет выполняться против какого-либо созданного или записанного источника данных. В большинстве систем, которые будут работать без проблем. В частности, на графических интерфейсах, основанных на X-Windows, довольно легко имитировать события и воспроизводить их в потоке сообщений X Windows.

Другим решением является использование своего виртуального пользователя. Вы можете программировать или записывать пользовательские взаимодействия и запускать свою программу как каждый раз. Такие решения можно найти для окон и для Linux-систем. Википедия дает длинный список инструментов: http://en.wikipedia.org/wiki/List_of_GUI_testing_tools

Также обратите внимание на sikuli http://www.sikuli.org/

0

Ответ на ваш вопрос нет. Предполагая на тот момент, что ваша система имеет только один процесс, система все равно будет реагировать на прерывания. Такие прерывания могут возникать в любое время. Воспроизведение обработки прерываний было бы бессмысленным без того, чтобы одно и то же внешнее событие происходило в одно и то же относительное время.