Макрос точки останова 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;
}