gpt4 book ai didi

c++ - 使用 GDB 调试核心转储时知道谁是继承者

转载 作者:IT王子 更新时间:2023-10-29 01:20:45 26 4
gpt4 key购买 nike

我的进程崩溃了,我有一个核心转储。我看到进程在运行类似于以下代码时崩溃了:

class father
{
public:
void virtual runVirtualFunc() = 0;
void func()
{
runVirtualFunc();
// ... crash here ... THIS IS THE PLACE I NEED TO KNOW WHO IS THE INHERITOR (so I could analyze which "runVirtualFunc" ran).
}
virtual ~father() {}
};

class son1 : public father
{
public:
void virtual runVirtualFunc() { /* do something 1*/}
};

class son2 : public father
{
public:
void virtual runVirtualFunc() { /* do something 2*/}
};

我在核心转储中有一个完整的调用堆栈,但我不知道运行“func”的继承者是谁。有没有办法弄清楚(也许通过 this 上的一些指针计算技巧?)

我没有实时附加进程,只有核心转储。

最佳答案

您可以使用info vtbl this 或只打印*this。您将在输出中看到继承者(在我的示例中为 son1):

(gdb) info vtbl this 
vtable for 'father' @ 0x400920 (subobject @ 0x613c20):
[0]: 0x4007d8 <son1::runVirtualFunc()>
(gdb) p *this
$2 = {_vptr.father = 0x400920 <vtable for son1+16>}
(gdb)

关于c++ - 使用 GDB 调试核心转储时知道谁是继承者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46197009/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com