4

我正在编写一个用于 BeagleBone Black 的基于事件的编程库,但遇到了一个奇怪的错误。

当我用完全相同的标志编译完全相同的代码时,我在基于 ARM 的处理器上收到以下错误,但在我运行为我的 x86 计算机编译的代码时却没有。

$ ./missionControl
pure virtual method called
pure virtual method called
pure virtual method called
terminate called recursively
terminate called recursively
Aborted

当我在笔记本电脑上编译和运行时,程序运行正常

这是我用来编译的命令(ish,我使用的是 Makefile,但两种编译方法都表现出完全相同的行为):

g++ -std=gnu++11 -pthread -O3 -D_GLIBCXX_USE_NANOSLEEP -o missionControl `find . -name *.cpp`

不管我是在实际 BeagleBone 上与 Ubuntu 交叉编译arm-linux-gnueabi-g++还是与 ARM 兼容,我仍然会在 ARM 上遇到错误。g++

我的问题是:什么可能导致此错误,我可以做些什么来尝试找到源?为什么对于相同版本的 G++,这种情况会发生在一种处理器架构上,而不是另一种?

谢谢!

这是来自 ARM 处理器的 GDB 的回溯:

#0  0xb6d4adf8 in raise () from /lib/libc.so.6
#1  0xb6d4e870 in abort () from /lib/libc.so.6
#2  0xb6f50ab4 in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib/libstdc++.so.6
#3  0xb6f4ea4c in ?? () from /usr/lib/libstdc++.so.6
#4  0xb6f4ea4c in ?? () from /usr/lib/libstdc++.so.6
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
4

3 回答 3

4

这个问题原来是由于在 BeagleBone 上运行的 ARM 版本的 libstdc++ 中的一个错误造成的。一个根本没有虚函数的小玩具程序在创建 std::thread 时会导致相同的错误(“调用纯虚函数”)。

我将尝试在 BeagleBone 本身上编译 gcc/libstdc++ 4.8 的自定义版本——即使这需要很长时间。

于 2013-11-17T23:42:03.437 回答
2

当您尝试使用动态分派在实现它的派生类型之前或在它已经析构之后调用基中的纯虚拟函数时,会发生称为错误的纯虚方法。

最常见的原因是,如果基类试图通过构造函数或析构函数调用在此级别纯的虚函数。除此之外,正如一些评论中指出的那样,如果您尝试访问死对象,您也可能会遇到同样的问题。

只需将调试器附加到程序并查看调用了哪些虚拟函数以及从何处调用。

于 2013-11-15T21:29:01.360 回答
2

请参阅:https ://groups.google.com/forum/#!topic/automatak-dnp3/Jisp_zGhd5I

并且:为什么这个简单的 c++11 线程示例在使用 clang 3.2 编译时会失败?

现在,我不知道为什么会这样,但至少对我有用。将以下四个预处理器定义添加到编译器命令行:

__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1
__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2
__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8

我还没有试验过它们是否都是必需的,或者你是否可以只用一些。但这为我解决了问题。感谢那些写了以上答案的人,感谢我的同事用谷歌搜索我:)

于 2014-04-23T01:48:42.950 回答