10

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

Error: symbol "func" not found
Error: argument list does not match function
Error: member function not present

有没有人成功地使这项工作正常进行?我在这里想念什么?

编辑:显然,调用的函数应该是调试器所在的当前范围内存在的符号。

4

7 回答 7

11

好的,这就是我发现
CXX0040 的意思是“ The C expression evaluator does not support implicit conversions involving constructor calls.
CXX0047 的意思是“ Overloaded functions can be called only if there is an exact parameter match or a match that does not require the construction of an object.

如此结合意味着如果我想调用一个函数,则任何参数都不应该有隐式转换,并且任何参数都不应该需要构造。
在这种情况下,“隐式转换”似乎包括一些琐碎的事情,比如转换'String''const String&'.
“构造”似乎包括微不足道的复制构造。所以通过值传递任何不是原始类型的东西都会导致错误。

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

因此,如果您希望能够从监视窗口调用方法,请添加一个仅采用指针和原语的重载,并在监视窗口中适当地传递参数。传递一个不是原始对象的对象,传递它的地址。

于 2008-11-07T02:45:18.843 回答
0

监视窗口受当前代码所在上下文的限制,例如,当您的代码进入一个函数并且您尝试访问隐藏在当前函数范围之外的另一个函数时,它将不起作用。

如果您在监视窗口中调用一个函数,请确保它在当前范围内可见且可访问。

于 2008-11-07T02:21:42.603 回答
0

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

于 2008-11-07T02:22:29.140 回答
0

我们发现这非常成功。一些非常简单的函数(包括成员函数)可以工作,通常是简单的属性获取器。其他更复杂的功能不起作用并给出错误。

我一直无法辨别确切的规则...

于 2008-11-07T02:34:43.607 回答
0

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

卡梅伦

于 2008-11-07T03:23:21.013 回答
0

这是您想要的“立即”窗口。而且您仅限于从当前断点所在的位置可见的内容。局部变量和该类(或全局变量)上的函数

于 2008-11-07T03:55:02.260 回答
0

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

于 2008-11-07T08:55:04.743 回答