Отладка в обратном направлении - PullRequest
5 голосов
/ 21 октября 2008

У меня два вопроса:

  1. При выполнении отладки на уровне источника (с использованием любого отладчика) любой отладчик сохраняет состояние некоторой итерации / цикла / любого выполненного кода и позволяет пользователю позже вернуться к ранее выполненному состоянию кода / состояния данных. момент времени при отладке? Необходимость в этом заключается в том, что некоторая переменная / указатель повреждается где-то раньше во время выполнения, но к нему обращаются через некоторое время / позже при выполнении кода, и именно тогда, когда происходит сбой / зависание кода, поэтому я хотел бы вернуться и посмотреть, какие функция / в какое время переменная была повреждена / неверное значение вычислено и записано в нее? Возможно ли это в любом отладчике (gcc, MSVC6.0 ...)

  2. Имеет ли какой-либо отладчик / IDE условие, что когда адрес / переменная памяти помечен для «анализа», он должен отображать, какая функция в каком файле и какой код изменили эту память (запись), каждый раз, когда это происходит? измененный / записи

-AD

Ответы [ 11 ]

10 голосов
/ 21 октября 2008

Звучит ужасно, будто вам захочется взять копию Visual Studio 2010.

Они реализуют почти точно то, что вы описываете в # 1 - есть экранная демонстрация нового «Исторического отладчика» в Visual Studio Team System 2010 на Канале 9 .

В этой записи, расположенной , есть немного больше об этом (это для CTP в апреле 2008 года под кодовым названием 'Rosario')

Я нашел это определение нового Historical Debugger из записи в блоге Маора Дэвида ( здесь ):

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

Вот еще одно видео прохождение также!

Редактировать: Я начинаю оценивать наиболее (1) последнее падение CTP (31/10 - 08 октября) Visual Studio 2010, и в них, похоже, реализована ранняя версия исторического отладчика. Возможно, стоит проверить.

(1) [http://www.microsoft.com/downloads/details.aspx?FamilyId=922B4655-93D0-4476-BDA4-94CF5F8D4814&displaylang=en]

4 голосов
/ 21 октября 2008

Я думаю, что вы пытаетесь добраться до Всезнающего отладчика или Материальных историй программы (с 1999 года !!).

Конечно, это больше исследовательских работ / реализаций, но кажется, что эти концепции наконец-то попадают в основные компиляторы.

3 голосов
/ 21 октября 2008

Для # 2 вы можете прочитать о контрольных точках , доступных в gdb, среди других отладчиков.

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

2 голосов
/ 06 июня 2012

С сентября 2009 года отладчик GNU (gdb) имеет возможность отменить отладку, то есть сделать шаг отлаживаемой программы и продолжить в обратном порядке. Это похоже на то, что вы просили.

Подробнее см. Здесь: http://sourceware.org/gdb/news/reversible.html.

2 голосов
/ 21 октября 2008

Возможно, вы захотите посмотреть Отладка воспроизведения от VMware.

Из ссылки:

Что мы сделали, так это интегрировали плагин Visual Studio для рабочей станции с технологией записи / воспроизведения. Теперь вы можете разработать приложение с помощью Visual Studio, а затем несколькими щелчками мыши запустить его на виртуальной машине в режиме записи. Затем вы можете воспроизвести запись столько раз, сколько захотите, используя все средства отладки, которые предоставляет Visual Studio.

Но мы не остановились на этом. Мы тоже реализовано уникальное «обратное исполнение» особенность. Скажем, если вы отлаживаете Повреждение памяти, вы можете положить точка наблюдения на поврежденной памяти и затем нажмите «Обратное продолжение» в Visual Меню плагинов для студии - и мы будем переместить запись прямо на место, где память была написана в последний раз к.

2 голосов
/ 21 октября 2008

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

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

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

1 голос
/ 21 октября 2008

Для первого выпуска: DDD / GDB имеет Backtrace , который показывает вам, как именно это добраться до этой точки. Также может помочь coredump.

Интересная статья о возможных побочных эффектах эта

1 голос
/ 21 октября 2008

Такие отладчики находятся в разработке. Вы можете проверить следующее Google Talk - отладка назад во времени

1 голос
/ 21 октября 2008

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

for (i = 0; i < list.size(); i++) {
  foo = list[i];
}

Вы можете установить условную точку останова для остановки, когда i == 17 или когда foo == null.

0 голосов
/ 21 октября 2008

Хотя текущие отладчики не сохраняют состояние, они в некоторой степени позволяют вам вернуться назад. Вы можете использовать функцию «переместить точку выполнения сюда» (конечно, реальное имя будет зависеть от вашего отладчика), чтобы установить выполняемую строку.

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

Я знаю, что это не то, что вы просили, но на данный момент это все, что у нас есть ... Я полагаю, что такая технология, вероятно, будет доступна довольно скоро, но на данный момент я думаю, что она находится на стадии "исследования".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...