程序步入错误的功能

时间:2011-10-10 17:00:54

标签: c++ callstack

我有一个子类,其中包含一系列在其父类中实现纯虚函数的函数。

调试时,一切都按照它应该的方式工作,除了一个函数。

当我尝试进入functionA()时,执行代替进入functionB(),调用堆栈说我实际上是在functionC()中。

functionA()可以在我从这个父类继承的其他地方工作。

更改函数名称不执行任何操作,清理/重建不执行任何操作。我通过在函数中添加一个伪参数来实现它,但我宁愿一个真正的解决方案。

2 个答案:

答案 0 :(得分:1)

听起来你有堆栈损坏,可能会混淆调试器,破坏你的程序,或两者兼而有之。

检查在数组中写得太多的东西,不安全地写入指针,写入未分配的内存等等。各种工具(如ValGrind)可能有所帮助。

因为您认为自己正在呼叫A,但最终只有B,而调试人员说您在C,则需要一些 HARD 关于哪个函数实际被调用的证据。 因为我们怀疑调试器可能会混淆,所以它不算是一个可靠的来源。我建议使用一些日志工具(printf会做得很好)来清楚地证明哪个函数实际上正在调用。

因为你说functionA在其他地方被调用时有效,所以我首先会怀疑在事情发生之前调用functionA的函数。该函数(我将其称为functionZ)可以可靠地调用其他类似的函数吗?或者它们都表明堆栈损坏?调试functionZ(及其上方的YX)仔细查找我所描述的问题。

答案 1 :(得分:1)

几个月前我遇到了类似的事情。

原来,作者在初始化过程中做了一些非常聪明的事情,编译器在调用方法调用时还没有设置派生类vtable。

找到它是一只熊。

您可能需要仔细查看vtable指针和生成的汇编语言,以确切了解初始化过程中的位置。

或者,对象中的vtable指针可能已被另一个对象的外部副本覆盖。