Visual Studio C++ 有没有更快的方法来设置断点值?

Visual Studio C++ is there a faster way to set breakpoint values?

提问人:Amadeus Bojiuc 提问时间:11/13/2023 最后编辑:Daniel A. WhiteAmadeus Bojiuc 更新时间:11/13/2023 访问量:69

问:

每次命中断点时,我都需要输入一个特定的变量值,但是手动输入非常耗时,有没有更快的方法?代码无法修改。理想情况下,最好有另一个 Visual Studio 应用可以将值提供给另一个 Visual Studio C++ 局部变量窗口。解决这个问题的最简单方法是什么?

C 工作室 可视化 C++

评论

3赞 Pepijn Kramer 11/13/2023
在我看来,这听起来像是您的代码缺少单元测试。单元测试应该能够将值输入到一些代码中,然后可以调试该测试。因此,请确保您可以将要测试的代码编译为(静态)库并开始编写单元测试
0赞 Amadeus Bojiuc 11/13/2023
我从来没有说过这是我的代码,它应该测试它的代码
2赞 Pepijn Kramer 11/13/2023
我从来没有说过这是你的代码,但这并不意味着它仍然缺乏单元测试;)使现有代码单元的(部分)可测试是值得的。(我什至会说,这是值得的)
0赞 Amadeus Bojiuc 11/13/2023
理想情况下是可以的,但不允许修改,否则很容易测试。
0赞 Pepijn Kramer 11/13/2023
经典的先有鸡还是先有蛋的问题。不允许更改代码,因为有人担心代码会损坏,因为没有单元测试。您仍然可以将部分代码复制到新库并对其进行测试。我的建议是,向你的组织反馈他们处于危险之中。现在你唯一能做的就是花时间调试,没有更快的方法,而且(过于简化)不是你的问题(而是你的组织问题,他们缺乏质量现在让你花费额外的时间)

答:

0赞 Clifford 11/13/2023 #1

使用调试器断点操作功能。操作对话框建议它只能用于在输出窗口中打印消息,但会计算两者之间的任何表达式,因此它可用于强制变量或调用函数。{...}

例:

  1. 首先创建一个断点并右键单击它,然后选择“操作...”:enter image description here

  2. 根据需要设置操作:enter image description here在本例中。{i = i == 10 ? 99990 : i}

  3. enter image description here

在这种情况下,此处 when 设置为 99990 以在循环中向前跳。i == 10i

我尝试将它与断点条件结合使用,但无法让它以我预期的方式工作;YMMV。

您可以通过调用操作表达式中的函数来执行更复杂的操作。例如,给定一个函数:

int test( int i )
{
    return i == 10 ? 99990 : i;
}

因此,您可以从操作表达式中调用它:.在本例中,它只执行前面的示例,但演示了可以调用函数。当然,该功能可以做更多的事情。{i=test(i)}

如果要将一系列测试值注入变量,则可以使用一个操作表达式:where 是您编写并链接到被测代码的函数。例如,它可能会从文件中读取一系列值。{i = getTestData()}getTestData()

当然,您的测试函数需要在断点站点的范围内,这通常需要修改代码以包含标头、原型或实际函数。这可以通过使用强制包含来避免。enter image description here

然后,所有测试激励文件都可以位于单独链接的模块中,并且代码本身不需要修改即可进行测试。

请注意,在频繁调用时,命中断点以评估操作表达式并继续操作会显著减慢执行速度。

评论

0赞 Clifford 11/13/2023
@AmadeusBojiuc 不客气,但请看 stackoverflow.com/help/someone-answers。特别是最后一段。无需感谢、点赞或接受,感激地收到;-)。
0赞 Amadeus Bojiuc 11/13/2023
是否有可能有类似 { i == Convert.Int32(File.ReadAllText(some path...))} 的东西?
0赞 Clifford 11/13/2023
@AmadeusBojiuc我不知道。这是 .NET 调用吗?建议使用 C++/CLI?我从来没有用过它。但正如我在编辑中发布的那样,您可以调用一个简单的函数接口来执行更复杂的操作,我建议这样做。比设置复杂的操作表达式更易于维护 - 它们可以签入到您的版本控制系统中,并且比项目 XML 文件更容易管理。
0赞 Clifford 11/13/2023
@AmadeusBojiuc......但不是,这是一个布尔表达式,而不是赋值。==