在使用Visual Studio 2005进行调试时调用函数

invoking functions while debugging with Visual Studio 2005?

本文关键字:调试 调用 函数 2005 Visual Studio      更新时间:2023-10-16

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

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

有人成功地使这项工作正常进行吗?我在这里错过了什么?

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

好的,这是我的发现
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&'
"构造"似乎包括琐碎的复制构造。因此,传递任何不是基元类型的值都会导致错误。

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

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

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

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

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

我们发现这是一种非常偶然的方式。一些非常简单的函数(包括成员函数)可以工作,通常是简单的属性getter。其他更复杂的函数不起作用,并出现错误。

我从来没能辨别出确切的规则。。。

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

Cameron

这是您想要的"立即"窗口。并且您被限制在当前断点所在的位置可见的内容。该类(或全局)上的局部变量和函数

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