我正在调试一个C++应用程序,并且在代码中找到了一个想要更改值的点(通过调试器)。现在,我设置了断点,接着进行以下步骤:
- 调试器达到断点
- 我修改要更改的变量
- 按F5继续运行
- 重复上述步骤
由于经常触发这个断点,所以我想自动化这个过程。我想将断点设置为运行宏并继续执行。
然而,我没有编写VisualStudio宏的经验,因此不知道如何命令执行程序的变量。我已经查找了一些资料,但是目前还没有找到有用的信息。
我正在调试一个C++应用程序,并且在代码中找到了一个想要更改值的点(通过调试器)。现在,我设置了断点,接着进行以下步骤:
由于经常触发这个断点,所以我想自动化这个过程。我想将断点设置为运行宏并继续执行。
然而,我没有编写VisualStudio宏的经验,因此不知道如何命令执行程序的变量。我已经查找了一些资料,但是目前还没有找到有用的信息。
我发现如何使用宏来实现这个操作。起初,我尝试使用Ctrl-Shift-R来记录键盘操作的宏,但是当我按下Ctrl-Alt-Q时,它停止了录制。不过,我能够编辑宏以使其正常工作。所以,以下是我所做的操作,以防其他人想要做类似的事情。
右键单击->新建宏
Public Module RecordingModule
Sub setvalue()
DTE.Debugger.ExecuteStatement("variable_name=0")
End Sub
End Module
这个宏将执行赋值语句,设置我的变量(在这种情况下,使其成为NULL指针)。
Macros.MyMacros.RecordingModule.setvalue
然后,我就能够运行我的程序,当程序执行时会自动将指针调整为NULL。这对于测试非常有用,而且不需要重新编译。
今天在寻找类似的东西时发现,您还可以使用“打印消息:”选项而不是宏。从代码中获取的值可以通过将其放在{}内来打印。关键是VS也将评估内容作为表达式-因此,{variable_name = 0}应该与宏示例实现相同。
如果你认为宏和 Microsoft Excel 的方式相同,那么你就错了。它并不是这样工作的。
在 C++ 中,宏指的是使用 #define 创建的小型内联函数。它是一个预处理器,因此宏就像使用其主体替换所有引用。
例如:
#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* globalIntPointer;
void func() {
*globalIntPointer = 3;
//...
}
int main() {
int a = 5;
globalIntPointer = &a;
func();
//...
globalIntPointer = NULL; // for safety sake
return 0;
}
当断点被触发时,您可以执行VS宏(打开断点窗口,右键单击相关的断点,然后从弹出菜单中选择“触发时...”)。但是,我不太确定如何编写一个修改正在调试的程序变量的宏 - 我从未这样做过,并且尝试录制一个宏来执行此操作似乎不起作用(它只记录激活正确窗口,而不是更改值)。