【问题标题】:Visual Studio Breakpoint Macro to modify a value?Visual Studio断点宏来修改一个值?
【发布时间】:2011-04-21 14:15:39
【问题描述】:

我正在调试一个应用程序 (C++),并且我在代码中找到了一个我想要更改值的点(通过调试器)。所以现在,我已经设置了一个断点,我这样做了:

  • 调试器到达断点
  • 我修改了我要更改的变量
  • 我按F5继续跑
  • 起泡、冲洗、重复

它经常碰到这个断点,所以我想自动化它。我想设置断点来运行宏,然后继续执行。

但是,我没有编写 VisualStudio 宏的经验,所以我不知道修改正在执行程序的变量的命令。我环顾四周,但到目前为止还没有在网上找到任何有用的东西。

【问题讨论】:

  • 你想怎么修改变量?例如增加一个计数器。
  • 我有一个指针,我想将它设置为 NULL

标签: c++ visual-studio visual-studio-2008 debugging macros


【解决方案1】:

我找到了如何使用宏来做到这一点。最初,我尝试使用 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 中不再适用 :(
【解决方案2】:

今天找类似的,发现也可以用'Print a message:'选项代替宏。代码中的值可以通过将它们放在 {} 中来打印。关键是 VS 也会将内容评估为表达式 - 因此 {variable_name=0} 应该实现与宏示例相同的效果。

【讨论】:

    【解决方案3】:

    如果您以与 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,做一个全局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 宏来做到这一点,该宏可以在遇到断点时运行,而无需修改代码。
    • 一个很好的答案,但是 OP 正在寻求有关编写/录制 Visual Studio 宏的帮助。
    • 正如其他人所说,我想要一个 Visual Studio 宏(与 Excel 或#define 无关)
    【解决方案4】:

    您可以在断点被命中时执行 VS 宏(打开断点窗口,右键单击有问题的断点,然后从弹出菜单中选择“当命中时...”)。我不太确定编写一个修改正在调试的程序变量的宏 - 我从来没有这样做过,并且尝试记录一个宏来做它的快速尝试似乎不起作用(全部记录正在激活右侧窗口,而不是更改值)。

    【讨论】:

    • 是的,我尝试录制一个宏来执行“Ctrl-Alt-Q”,但是当窗口出现时它停止录制。
    • @Tim:是否可以只添加一两行代码来代替?
    • 我正在尝试找到一种不会强制完全重新编译的方法。不过我确实找到了一种方法,所以我会分享它。
    【解决方案5】:

    选择“条件...”并在“条件:”文本框中为有问题的变量写一个赋值。这自然会解析为“真”,而不是实际的条件测试。因此,断点永远不会被命中,并且您的变量已被相应地设置。

    【讨论】:

    • 我试了一下,收到礼物:无法设置断点。此表达式有副作用,不会被计算。
    猜你喜欢
    • 2017-09-26
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 2017-09-07
    相关资源
    最近更新 更多