【发布时间】:2011-12-02 11:02:33
【问题描述】:
我的一个 C++ 程序有一个有趣的问题。显然,我的一个类的 vtable 在程序执行期间/变得混乱。在 gdb 会话中,我发现如果我直接调用对象的方法,它会成功,但如果我使用指针或引用,我最终会成为一个完全不相关的类的析构函数,该类不会很快被实例化。当然没有 this-Pointer 改变。
假设我的观察是正确的,我如何在 gdb 中查看对象的 vtable?我在 Linux 上使用 gcc,我的 gdb 版本是 GNU gdb (Ubuntu/Linaro 7.3-0ubuntu2) 7.3-2011.08。
【问题讨论】:
-
对此我不是 100%,所以我不会将其作为答案发布,但看看
((void*)this)-1应该就足够了(指针长度 beforethis) 获得一个指向实际函数的指针数组的指针(0 终止?)。它们不会携带方法名称或任何东西,但这就是 vtable 的全部内容。 -
您是否使用 Valgrind 或任何类似工具分析您的代码?
-
你怎么知道你最终会使用不同的功能?你在调试或输出什么东西吗?
-
正如@Als 所说,使用
valgrind。您通常无法修改 vtable,因为 is 在受保护的内存中,但很可能会弄乱 vptr,使其指向其他内容。 -
我正在调试。我在虚函数内部设置了一个断点。如果我通过对象调用它会被击中,但如果我通过指针调用则不会。 - 我现在要试试 valgrind,谢谢你的提示。
标签: c++ gcc gdb virtual-functions