Visual Studio 断点宏修改值?

7

我正在调试一个C++应用程序,并且在代码中找到了一个想要更改值的点(通过调试器)。现在,我设置了断点,接着进行以下步骤:

  • 调试器达到断点
  • 我修改要更改的变量
  • 按F5继续运行
  • 重复上述步骤

由于经常触发这个断点,所以我想自动化这个过程。我想将断点设置为运行宏并继续执行。

然而,我没有编写VisualStudio宏的经验,因此不知道如何命令执行程序的变量。我已经查找了一些资料,但是目前还没有找到有用的信息。


你想如何修改变量?例如,增加一个计数器。 - Dennis
我有一个指针,我想将它设置为NULL。 - Tim
5个回答

13

我发现如何使用宏来实现这个操作。起初,我尝试使用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。这对于测试非常有用,而且不需要重新编译。


在Visual Studio 2015中不再适用 :( - Jhonny D. Cano -Leftware-

4

今天在寻找类似的东西时发现,您还可以使用“打印消息:”选项而不是宏。从代码中获取的值可以通过将其放在{}内来打印。关键是VS也将评估内容作为表达式-因此,{variable_name = 0}应该与宏示例实现相同。


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;

如果不是,但保证一定存在,你可能需要进行一些 hack。假设这个变量是一个 int,那么可以创建一个全局的 int 指针。如果这个变量是静态的,要确保将其设置为其地址,并在其范围内设置回 NULL。如果它是动态的,你可能需要额外的工作。下面是一个示例:
int* globalIntPointer;

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

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

不行,不行。他想知道如何使用Visual Studio宏在断点被命中时运行,而不修改代码。 - Chubsdad
一个不错的回答,不过OP正在寻求关于编写/记录Visual Studio宏的帮助。 - Dennis
正如其他人所说,我想要一个Visual Studio宏(与Excel或#define无关)。 - Tim

0
选择“条件...”并在“条件:”文本框中为所涉及的变量编写一个赋值语句。这将自然地解析为“true”,因为它不是一个实际的条件测试。因此,断点永远不会被触发,并且您的变量已经被正确设置。

我尝试了一下并收到了一个礼物:断点无法设置。此表达式具有副作用,因此不会被评估。 - sergiol

0

当断点被触发时,您可以执行VS宏(打开断点窗口,右键单击相关的断点,然后从弹出菜单中选择“触发时...”)。但是,我不太确定如何编写一个修改正在调试的程序变量的宏 - 我从未这样做过,并且尝试录制一个宏来执行此操作似乎不起作用(它只记录激活正确窗口,而不是更改值)。


是的,我尝试录制一个宏来执行“Ctrl-Alt-Q”,但当窗口出现时,录制停止了。 - Tim
@Tim:能否在代码中添加一两行来进行赋值操作呢? - Jerry Coffin
我正在尝试找到一种不需要进行完整重新编译的方法。不过,我已经找到了一种方法,所以我会分享出来。 - Tim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接