【问题标题】:invoking functions while debugging with Visual Studio 2005?使用 Visual Studio 2005 调试时调用函数?
【发布时间】:2010-09-21 05:25:22
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c++ visual-studio debugging visual-c++-2005 watch


    【解决方案1】:

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

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

    【讨论】:

    • 这不是问题。从当前代码点可以看到我尝试调用的任何函数。
    • 那么请在您的问题中说明这一事实。显然,我应该澄清而不是回答。
    【解决方案2】:

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

    【讨论】:

    • 如果错误消息会说“抱歉,仅适用于托管代码”这样会不会很痛苦。嗯。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      好的,这就是我找到的
      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&' 之类的琐碎事情。
      “构造”似乎包括微不足道的复制构造。所以通过值传递任何不是原始类型的东西都会导致错误。

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

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

      【讨论】:

      • 我来这里是为了在调试时搜索如何在 VS 中调用特定函数(顺便说一句,我正在使用 C#),很难找到,所以我会在这里留下评论:如何在 Visual Studio 调试器中调用函数:打开«Debug→Window→Immediate»,然后在«Immediate»窗口中写入要评估的函数.
      【解决方案5】:

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

      卡梅隆

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-05
            • 1970-01-01
            • 1970-01-01
            • 2016-02-11
            相关资源
            最近更新 更多