У меня два вопроса:
При выполнении отладки на уровне исходного кода (с использованием любого отладчика) сохраняет ли какой-либо отладчик состояние некоторой итерации / цикла for / любого выполненного кода и позволяет ли пользователю вернуться к этому ранее выполненному состоянию кода / данных в более поздний момент времени во время отладки? Необходимость в этом заключается в том, что некоторая переменная / указатель поврежден где-то раньше во время выполнения, но доступ к нему осуществляется через некоторое время / позже при выполнении кода, и именно тогда он дает сбой / вешает код, поэтому я хотел бы вернуться и посмотреть, какой функция / в какое время переменная была повреждена / было вычислено и записано неверное значение? Возможно ли это в любом отладчике (gcc, MSVC6.0 ...)
Есть ли в отладчике / IDE положение, согласно которому, когда адрес / переменная памяти помечена для «анализа», он должен отображать, какая функция в каком файле и какой код изменил эту память (запись), каждый раз, когда он изменяется / записывается?
-ОБЪЯВЛЕНИЕ

Я считаю, что в последней версии OCaml это есть. Это кажется совершенно новым увлечением, но IIRC это входит в список желаний будущей версии Visual Studio.
Функция VS, которую я не использовал, может отслеживать объекты (сделать идентификатор объекта или что-то в этом роде).
Я не знаю ни одного отладчика, который позволяет сохранять состояние, чтобы вернуться к нему позже. У отладчика не будет возможности узнать, какое состояние имеет значение. Самое близкое, что вы могли бы сделать, - это создать в какой-то момент файл дампа, который позволил бы вам позже проверить все состояние программы.
Visual Studio поддерживает точки останова по данным, который будет работать с отладчиком всякий раз, когда также будет записана данная ячейка памяти.
Они могут быть очень полезны для выяснения того, что наступает на поврежденный фрагмент памяти. Однако существуют ограничения на количество точек останова по данным, которые вы можете установить, поскольку они реализуются с использованием аппаратной поддержки регистров со стороны процессора.
Для №2 вы можете прочитать о точки наблюдения, которые доступны в gdb, среди других отладчиков.
Watchpoints are similar to breakpoints. However, watchpoints are not set for functions or lines of code. Watchpoints are set on variables. When those variables are read or written, the watchpoint is triggered and program execution stops.
Для первой точки вы можете попробовать условные точки останова. Кажется, что большинство отладчиков, которые я использовал, имеют эту функцию, хотя многие люди об этом не знают. Вы можете установить точку останова только тогда, когда выполняется какое-то условие, например, ваша переменная итератора - это какое-то число или какая-то другая переменная имеет значение NULL. Например:
for (i = 0; i < list.size(); i++) {
foo = list[i];
}
Вы можете установить условную точку останова, чтобы останавливаться, когда i == 17 или foo == null.
Такие отладчики находятся в стадии разработки. Вы можете проверить следующие Google Talk - отладка в обратном направлении
Я думал об этом. Это исследование очень многообещающее.
По первому выпуску: ddd / gdb имеет обратный след, который показывает вам, как именно добраться до этой точки. Также может помочь coredump.
Интересная статья о возможных побочных эффектах - Вот этот.
Это звучит ужасно, как если бы вы захотели получить копию Visual Studio 2010.
Они реализуют почти в точности то, что вы описываете в №1 - на Канал 9 есть скринкаст о новом «Историческом отладчике» в Visual Studio Team System 2010.
Об этом немного больше в этой записи, расположенной здесь (это для CTP от апреля 2008 года с кодовым именем Rosario).
Я нашел это определение нового исторического отладчика из записи блога Маора Дэвида (здесь):
«Исторический отладчик Visual Studio фиксирует и записывает, что делает приложение во время его работы. При возникновении ошибки вы можете быстро найти основную причину, исследуя информацию, которая была записана историческим отладчиком. В любой момент во время отладки вы можете перейти назад и вперед во времени, чтобы определить, где произошла ошибка ".
Вот еще один видео прохождение!
Обновлено: я начинаю оценивать наибольшее падение (1) недавняя ОСАГО (31/10 - 8 октября) Visual Studio 2010, и, похоже, в них реализована ранняя версия исторического отладчика. Возможно, стоит проверить.
Я думаю, вы пытаетесь добраться до Всезнающий отладчик или Материальная история программ (с 1999 года !!).
Конечно, это больше исследовательских работ / реализаций, но похоже, что эти концепции наконец попадают в основные компиляторы.
Вы можете посмотреть Воспроизведение отладки от VMware.
По ссылке:
What we did was integrating Visual Studio plugin for Workstation with Record/Replay technology. You can now develop your application with Visual Studio, and then with a few mouse clicks launch it in a VM in recording mode. You can then replay recording as many times as you want, using all the debugging facilities Visual Studio provides.
But we did not stop at that. We also implemented unique "reverse execution" feature. Say, if you are debugging a memory corruption, you can put watchpoint on corrupted memory and then hit "Reverse Continue" in Visual Studio plugin menu - and we'll navigate the recording right to the place where memory was last written to.
Хотя текущие отладчики не сохраняют состояние, они в некоторой степени позволяют вернуться назад. Вы можете использовать функцию «переместить точку выполнения сюда» (фактическое имя, конечно, будет зависеть от вашего отладчика), чтобы установить выполняемую строку.
Это действительно хорошо работает только для прыжков внутри одной функции, но может быть полезно для «повторной попытки» с другим значением - вы прерываете цикл, используете отладчик для изменения значений переменных, а затем возвращаетесь к началу петли. В качестве альтернативы, если вы знаете, что вызов функции потерпит неудачу, но вы хотите увидеть, что произойдет после этого (например ... что-то истекло, потому что вы были остановлены в отладчике, но вы хотите продолжить выполнение, как если бы оно не было) t истекло время), вы можете использовать функцию «переместить точку выполнения сюда», чтобы пропустить этот код.
Я знаю, что это не то, о чем вы просили, но на данный момент это все, что у нас есть ... Я считаю, что такая технология, вероятно, будет доступна довольно скоро, но на данный момент я думаю, что она находится в стадии "исследования".
С сентября 2009 года отладчик GNU (gdb) имеет возможность обратной отладки, то есть возможность сделать отлаживаемую программу пошагово и продолжить в обратном порядке. Это похоже на то, о чем вы просили.
Подробнее см. Здесь: http://sourceware.org/gdb/news/reversible.html.
Если отладка - это процесс удаления ошибок [или, по крайней мере, их выявления], то отладка в обратном направлении должна быть процессом их вставки ... или, другими словами, программирования!