Макрос точки останова Visual Studio для изменения значения?

Я отлаживаю приложение (c++), и я нашел точку в коде, где я хочу изменить значение (через отладчик). Итак, прямо сейчас у меня есть точка останова, после чего я делаю:

  • отладчик достигает точки останова
  • Я изменяю переменную, которую хочу изменить
  • Я нажал F5, чтобы продолжить работу
  • намылить, смыть, повторить

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

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

5 ответов


Я нашел, как это сделать с макросом. Первоначально я попытался использовать Ctrl-Shift-R для записи макроса нажатий клавиш, но он прекратил запись, когда я сделал Ctrl-Alt-Q. но я смог отредактировать макрос, чтобы заставить его работать. Итак, вот что я сделал, если кто-то еще захочет сделать что-то подобное.

  • Инструменты - > Макросы - > Проводник Макросов
  • щелкните правой кнопкой мыши -> новый макрос

    Public Module RecordingModule
        Sub setvalue()
            DTE.Debugger.ExecuteStatement("variable_name=0")
        End Sub
    End Module
    

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

  • щелкните правой кнопкой мыши на точке останова - > при попадании...
  • галочку "запустить макрос"
  • выберите Macros.MyMacros.RecordingModule.setvalue
  • галочку "продолжить выполнение"
  • нажмите OK

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


ищет подобное сегодня и обнаружил, что вы также можете использовать опцию "печать сообщения:" вместо макроса. Значения из кода можно распечатать, поместив их внутрь {}. Ключ в том, что VS также будет оценивать содержимое как выражение-поэтому {variable_name=0} должен достичь того же, что и пример макроса.


вы можете выполнить макрос VS при попадании точки останова(откройте окно точки останова, щелкните правой кнопкой мыши на точке останова и выберите " при попадании..."off the popup menu). Я менее уверен в написании макроса, который изменяет переменную программы под debug, хотя-я никогда этого не делал, и быстрая попытка с попыткой записать макрос, чтобы сделать это, похоже, не работает (все записи активируют правое окно, не изменяя значение).


Выбираем "Условие..."и напишите назначение для рассматриваемой переменной в текстовом поле" условие:". Это, естественно, решит "true", не будучи фактическим условным тестом. Поэтому точка останова никогда не попадает, и ваша переменная была установлена соответствующим образом.


если вы думаете о макро так же, как Microsoft excel, то вам не повезло. Это не совсем так.

в C++ макрос ссылается на небольшую встроенную функцию, созданную с помощью #define. Это препроцессор, поэтому макрос похож на использование replace для всех его ссылок с его телом.

например:

#define add(a,b) ((a)+(b))

int main() {
  int a=3, b=4, c=5, d=6, e, f;
  d = add(a,b);
  e = add(c,d);
}

хотел бы компилятор c++ как:

int main() {
  int a=3, b=4, c=5, ...;
  d = ((a)+(b));
  e = ((c)+(d));
}

теперь вернемся к вашему вопросу. Если переменная находится в области на эта точка останова, просто установите ее из своего кода:

myVar = myValue;

если это не так, но он гарантированно существует, вам может понадобиться немного взломать. Скажем, что эта переменная является int, сделайте глобальный указатель int. Если эта переменная статична, обязательно установите ее в свой адрес и обратно в NULL внутри ее области. Если это динамично, вам может понадобиться дополнительная работа. Вот пример:

int* globalIntPointer;

void func() {
  *globalIntPointer = 3;
  //...
}

int main() {
  int a = 5;
  globalIntPointer = &a;
  func();
  //...
  globalIntPointer = NULL; // for safety sake
  return 0;
}