Как обратная отладка работает?

Нет никакого верного способа однозначно определить компьютер, если Вы предполагаете, что компьютер создается со многими частями, которые могут быть заменены в конечном счете.

Некоторые аппаратные части - MAC-адрес, дисковый порядковый номер жесткого диска, даже последовательная материнская плата, и т.д. - являются несколькими хорошими источниками "уникальности", но как можно знать, решает ли клиент обновить часть, лицензия зависит от... быть подготовленной к некоторой поддержке клиентов. Также для учета то, что некоторые части могут имитироваться (MAC, являющийся одним из них).

проверка лицензий онлайн должна иначе пойти - можно ли управлять всем на стороне сервера и даже определить ли собственные правила для нее (сколько лицензий на клиент/установку, параллелизм, и т.д.), но большая вещь отметить - то, что происходит, когда соединение не может быть установлено?

80
задан Nathan Fellman 24 September 2009 в 08:35
поделиться

5 ответов

Я сопровождаю gdb и один из авторов новой обратной отладки. Буду рад рассказать, как это работает. Как предполагали некоторые люди, вам нужно сохранить достаточно состояния машины, чтобы вы могли восстановить его позже. Существует ряд схем, одна из которых заключается в простом сохранении регистров или ячеек памяти, которые изменяются каждой машинной командой. Затем, чтобы «отменить» эту инструкцию, вы просто возвращаете данные в этих регистрах или ячейках памяти.

Да, это дорого, но современные процессоры настолько быстры, что, когда вы все равно интерактивны (выполняете пошаговое выполнение или точки останова), вы не особо этого замечаю.

121
ответ дан 24 November 2019 в 09:54
поделиться

Здесь показано, как работает другой обратный отладчик, называемый ODB. Извлечение:

Всеведущая отладка - это идея сбор "отметок времени" на каждом "достопримечательность" (установка значения, вызов метода, выброс / перехват исключения) в программу, а затем разрешив программист, чтобы использовать эти отметки времени для изучить историю этой программы run.

ODB ... вставляет код в классы программы как они загружаются и когда программа запускается, события записываются.

Я предполагаю, что GDB работает таким же образом.

2
ответ дан 24 November 2019 в 09:54
поделиться

Reverse debugging means you can run the program backwards, which is very useful to track down the cause of a problem.

You don't need to store the complete machine state for each step, only the changes. It is probably still quite expensive.

2
ответ дан 24 November 2019 в 09:54
поделиться

Натан Феллман писал:

Но разве обратная отладка позволяет вам откатить только команды перехода к следующему и шагу, которые вы ввели, или он позволяет вам отменить любое количество инструкций?

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

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

]Да. Если вы включили режим записи до того, как дойдете до точки останова.

3
ответ дан 24 November 2019 в 09:54
поделиться

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

Другое решение для его реализации - это отслеживание выполнения на физическом оборудовании, как это делают GreenHills и Lauterbach в их аппаратных отладчиках. Основываясь на этой фиксированной трассировке действия каждой инструкции, вы можете затем перейти к любой точке трассировки, по очереди удаляя эффекты каждой инструкции. Обратите внимание: это предполагает, что вы можете отслеживать все, что влияет на состояние, видимое в отладчике.

Другой способ - использовать метод контрольной точки + повторного выполнения, который используется VmWare Workstation 6.5 и Virtutech Simics 3.0 (и более поздними версиями), и который, похоже, будет поставляться с Visual Studio 2010. Здесь вы используете виртуальную машину или симулятор, чтобы получить определенный уровень косвенности при выполнении системы. Вы регулярно выгружаете все состояние на диск или в память, а затем полагаетесь на способность симулятора детерминированно повторно выполнить тот же самый путь к программе.

Упрощенно, это работает так: скажем, вы находитесь в момент времени T в исполнении системы. Чтобы перейти к моменту T-1, вы выбираете некоторую контрольную точку из точки t список рассылки gdb и обсуждение после этого в списке рассылки gdb для получения более подробной информации. Я сам довольно регулярно использую этот подход для отладки сложного кода, особенно в драйверах устройств и при ранней загрузке ОС.

Другой источник информации - это технический документ Virtutech по контрольным точкам (который я написал в полном объеме).

11
ответ дан 24 November 2019 в 09:54
поделиться