【发布时间】:2013-11-15 21:00:56
【问题描述】:
我正在编写一个用于 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 兼容的 g++ 进行交叉编译,我仍然在 ARM 上遇到错误。
我的问题是:什么可能导致此错误,我可以做些什么来尝试找到源?为什么相同版本的 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?)
【问题讨论】:
-
您可能在管理某些多态对象或对象集合的生命周期时出错。当您尝试删除已删除的内容时,通常会显示该错误。
-
这个错误发生在我启动我的程序之前,在任何东西都会被删除之前(我认为)......我在整个程序中使用智能指针,并且 valgrind 报告没有错误并且所有内存都被释放在 x86 上正确运行的程序结束时。
-
嗯...尝试减少问题?删除全局变量直到它起作用?您确定错误发生在
main被调用之前? -
@KerrekSB 我不确定它是否在调用 main() 之前。让我尝试在 main() 的顶部添加一个
cout。我唯一拥有的全局变量是一个翻译单元中的互斥体,所以我会尝试将它纳入一个类。 -
我也有同样的问题 - 我猜没有多少人在 beagleboard 上使用 std::thread 吧?
标签: c++ cross-compiling embedded-linux virtual-functions g++-4.7