我试图在我的应用程序中调试一个段错误,但无法弄清楚问题是什么。发布完整代码太复杂了,所以我试图将问题分解为一个更简单的版本 - 只是为了弄清楚我的基本示例完美无缺。
但是,我仍然坚持尝试运行我的应用程序,并希望对以下错误的任何输入 - 非常有帮助 - 错误:
Program received signal SIGSEGV, Segmentation fault.
0x00007fffdd921f38 in main_arena () from /lib/libc.so.6
当我尝试getType()
按照以下方式调用时,会发生这种情况:
std::map<long, QVAbstractElement *> mElements;
<...>//skipping some stuff
LineElement * insert_el = new LineElement();
mElements[0] = insert_el;
<...>//skipping a lot more stuff
AbstractElement * el = mElements.at(0);
if (!el)
{
printf("ERROR");
return (1);
}
int t = el->getType();
在这种情况下,我知道指针el
是有效的,但实际对象是 a LineElement
,它派生自AbstractElement
并且getType()
是virtual
仅在基类 ( AbstractElement
) 中实现的函数。使用 gdb 进行调试时,我得到以下指针地址:
(gdb) x el
0x11cf600: 0xdd921f48
(gdb) p el
$1 = (class AbstractElement *) 0x11cf600
现在,当尝试getType
从 gdb 调用该函数 () 时,我得到以下信息:
(gdb) x el->getType()
warning: can't find linker symbol for virtual table for `AbstractElement' value
warning: can't find linker symbol for virtual table for `AbstractElement' value
本质上,我认为即使我的指针检查有效并且与创建此对象的时间相比地址仍然相同,但我无法调用该对象的任何函数。
第一个问题:这与从不同线程调用有什么关系吗?我将 Qt 用于我的 UI,而不是 100% 确定 Qt 是否会创建它自己的线程?
第二个问题:这实际上是否意味着问题可能出现在我的代码中的任何地方,结果这只是一个混乱的函数表?