我知道这可能是可能的,但我从来没有设法做过 在VS2005(C ++)中,在调试时,能够从我正在调试的代码中调用一个函数。
在调试复杂的数据结构时,此功能有时是必不可少的,而这些数据结构只能通过观察窗口的常规功能轻松探索 监视窗口似乎允许编写函数调用,但每次我尝试它时都会给我一个错误或另一个错误。

错误:符号“func”找不到
错误:参数列表与函数不匹配 错误:成员函数不存在

有没有人能成功地使这项工作成功? 我在这里缺少什么?

编辑:显然,调用的函数应该是调试器所在的当前作用域中的符号。

有帮助吗?

解决方案

好的,这是我找到的东西 CXX0040表示“ C表达式求值程序不支持涉及构造函数调用的隐式转换。"
CXX0047表示“只有在存在精确参数匹配或不需要构造对象的匹配时才能调用重载函数。"

所以组合它意味着如果我想调用一个函数,那么所有参数都不应该有隐式转换,并且所有参数都不需要构造。
“隐式转换”在这种情况下似乎包括一些简单的事情,比如将'String'转换为'const String&'
"施工"似乎包括琐碎的复制结构。因此,传递值不是基本类型的任何东西都会导致错误。

所以这基本上只留下了只接受基本类型或指针的函数。
我刚刚成功地测试了这个理论。

因此,如果您希望能够从监视窗口调用方法,请添加一个只接受指针和基元的重载,并在监视窗口中相应地传递参数。传递非原始对象传递其地址。

其他提示

监视窗口受当前代码的上下文限制,例如,当您的代码进入某个函数并且您尝试访问隐藏在当前函数范围内的其他函数时,它将无效。

如果您在监视窗口中调用某个函数,请确保它在当前作用域中可见且可访问。

据我所知,在调试非托管C ++时,您无法从Watch窗口执行代码。这适用于C#(可能还有VB.NET和托管C ++,但我对此并不乐观)。很可能它允许它,因为它适用于某些语言,但不适用于其他语言。

我们发现这种方式非常受欢迎。一些非常简单的函数(包括成员函数)工作,通常是简单的属性getter。其他更复杂的功能不起作用并产生错误。

我从来没有能够辨别出准确的规则......

我没有对此进行测试,但我一直认为这就是即时窗口(执行代码)

卡梅伦

这是“立即”的你想要的窗口。而且你只能看到当前断点所在的位置。局部变量和该类(或全局变量)上的函数

根据我的经验,即时窗口存在一些缺点。如果类来自不同的DLL,则不能调用类的成员函数,但会得到误导性的错误消息。如果任何东西在同一个DLL中(例如通过静态链接所有其他东西),调用成员是相当可靠的。但是复杂的东西可能会或可能不会起作用,正如其他人所提到的那样。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top