如何在Visual Studio中调试错误的调用堆栈
How to debug an erroneous call stack in Visual Studio
我正在使用一个来自第三方库的巨大类,这里是相关内容的摘录:
class SomeClass {
// ...
public:
// ...
virtual int SetTableSize(unsigned int uiTableID, int iSize);
// ...
protected:
// ...
virtual int Set_0xB0_0x23_IsoTableData(unsigned char* ucData, int iLen);
// ...
};
我的应用程序因内存访问冲突而中断。调用栈中最上面的项是Set_0xB0_0x23_IsoTableData
实现中的代码行,第二项是如下代码行:
someClassInstance.SetTableSize(2, 400);
在调试视图中,ucData
的值为0x00000002
,因此它实际上看起来不是调用SetTableSize
的实现,而是使用指定的参数调用Set_0xB0_0x23_IsoTableData
-这显然会导致错误,因为指针无效。
构造一个最小的工作示例来重现错误是不可能的——至少在我弄清楚这种情况发生的原因之前是不可能的。SomeClass
头确实有相当多的#ifdef
s,所以我首先想到的是,在编译包含SomeClass
的模块时,预处理器的定义与编译我的调用代码时不同。但是,我仔细检查了一下,它们的定义是相同的。
所以我想问的基本上是:
- 在什么条件下可以调用一个虚方法调用另一个虚方法的实现?(这与继承无关——这两个方法定义在同一个类中,甚至不共享它们的签名,并且具有不同的可见性)
- 我如何调试这样的错误?是否可以在Visual Studio中查看类实例的调度向量?
对于这类问题,我的标准答案是:全部重建。在某些情况下,它就像那样简单/愚蠢(至少对于Visual Studio来说)。
如果错误仍然存在,那么我要做的就是调试:运行代码,直到你能说"它现在不可能发生"。然后一步一步、一行一行地调试,并密切观察调用堆栈。
不,这一点都不好玩。
相关文章:
- C++ 结构错误"调用'erase'没有匹配函数
- 错误:调用 .. at return 语句时没有匹配函数
- 从C++代码抛出错误调用 JavaScript 回调函数 - nbind
- 错误:调用"make_pair"没有匹配函数
- 错误:调用 std::thread 没有匹配函数
- SFML 中的分段错误 调用 sf::窗口::关闭后
- 错误:调用函数指针没有匹配函数
- 汇编错误:调用基本型构造函数时无效的转换
- 错误:调用计数器::计数器()没有匹配函数
- C++ 通过函数指针错误调用成员函数
- 错误:调用 cargaison::cargaison() 时没有匹配函数
- 简单矩阵类,错误:调用私有构造函数
- 带有返回类型的错误调用模板到会员函数
- 错误:调用没有匹配函数(无法解决?
- 从 C 代码链接错误调用C++函数(使用 gcc 进行链接)
- 错误:调用 'pybind11::buffer_info::buffer_info 没有匹配函数
- 错误:调用terminate引发exceptionAbort陷阱:6
- 错误调用功能无法转换类型
- C++ 中的文件处理错误 - 调用"std::basic_fstream<char, std::char_traits<char> >::open(const char[8],
- 对成员函数set_value的错误调用是不明确的(在 xcode 中使用 pugixml 库)