在使用Visual Studio 2005进行调试时调用函数
invoking functions while debugging with Visual Studio 2005?
我知道这可能是可能的,但我从未做到
在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中有任何内容(例如,通过静态链接所有其他内容),则调用成员是相当可靠的。但正如其他人所说,复杂的东西可能起作用,也可能不起作用。
- OpenCV 3 Visual Studio 2017 调试,调用堆栈没有.pdb文件
- 从Excel VBA调用C++DLL只能从Visual Studio中的调试实例工作
- 在C++中调用 free() 会触发 ntdll!DbgBreakPoint() 在调试中,但在发布中崩溃
- 有没有办法调试排队等待对象的Qt插槽调用
- 调试"在抛出 ..) 实例后终止调用",当异常 _should_ 被捕获时
- 调试Visual Studio中可执行文件调用的C 文件
- 我如何调用在调试模式下具有主要的程序或代码
- MFC DDX_RADIO会导致调用dodataexchange(dlgdata.cpp行286)时导致调试断言失败
- 如何调试由另一个程序调用的程序
- 在调试中,如何知道对函数的重复调用中参数的统计数据(max-min,average,distribution..)
- GDB正在调试一个缺少特定调用堆栈的符号表的核心转储
- 每当在C++中调用 delete/delete[] 时都会中断调试器
- 调试:跟踪(和diffing)同一程序的两个版本的函数调用树
- 调试QT插槽未调用
- 调试 c++ 互斥锁时截断的调用堆栈
- 在VS2012下调试多个项目 - 主项目调用子项目
- 如何调试外部调用的C++可执行文件
- 有没有办法调试从C# DllImport调用的c ++ dll
- 可以valgrind报告丢失块的内存地址(用于调试递归函数调用)
- 为什么连VS调试器外启动的程序都不能调用terminate方法呢