关于thread使用的错误:pure virtual method called terminate called without an active exception

简介: 关于thread使用的错误:pure virtual method called terminate called without an active exception

今天遇到一个问题,错误提示如下:

pure virtual method called
terminate called without an active exception

在网上搜了下,查到的问题原因大多数纯虚函数调用的问题。我程序里确实有纯虚函数调用,但是子类已经将其实现了,并且在调用时,也实例化了子类,没有查到匹配答案。只能进一步查找问题,加调试信息。


还有个比较奇怪的现象,我用gdb去运行程序,想单步跟一下,可以是用gdb运行时,却有不出问题了!


只能通过加日志来查了,最后查到是在这一个地方出问题的:

m_taskThreat = thread(&CXXX::XXXX, this);

也就是创建线程时出问题的,这个thread是c++11后引入的线程类,可能是当前的编译器不支持导致的。


这个程序在虚拟机(Ubuntu16.04系统)下是可以正常运行的。


板子上的编译器是:

Using built-in specs.
COLLECT_GCC=arm-hisiv500-linux-gcc
COLLECT_LTO_WRAPPER=/opt/hisi-linux/x86-arm/arm-hisiv500-linux/bin/../libexec/gcc/arm-hisiv500-linux-uclibcgnueabi/4.9.4/lto-wrapper
Target: arm-hisiv500-linux-uclibcgnueabi
Configured with: ../gcc-linaro-4.9-2015.06/configure --host=x86_64-linux-gnu --build=x86_64-linux-gnu --target=arm-hisiv500-linux-uclibcgnueabi --prefix=/home/sying/toolchain_ljhui/gcc4_9/arm-hisiv500-linux/gcc-uclibc/install/arm-hisiv500-linux --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --with-arch=armv5te --with-gnu-as --with-gnu-ld --enable-languages=c,c++ --enable-shared --enable-lto --enable-symvers=gnu --enable-__cxa_atexit --enable-nls --enable-clocale=gnu --enable-extra-hisi-multilibs --with-sysroot=/home/sying/toolchain_ljhui/gcc4_9/arm-hisiv500-linux/gcc-uclibc/install/arm-hisiv500-linux/target --with-build-sysroot=/home/sying/toolchain_ljhui/gcc4_9/arm-hisiv500-linux/gcc-uclibc/install/arm-hisiv500-linux/target --with-gmp=/home/sying/toolchain_ljhui/gcc4_9/arm-hisiv500-linux/gcc-uclibc/install/host_lib --with-mpfr=/home/sying/toolchain_ljhui/gcc4_9/arm-hisiv500-linux/gcc-uclibc/install/host_lib --with-mpc=/home/sying/toolchain_ljhui/gcc4_9/arm-hisiv500-linux/gcc-uclibc/install/host_lib --with-ppl=/home/sying/toolchain_ljhui/gcc4_9/arm-hisiv500-linux/gcc-uclibc/install/host_lib --with-cloog=/home/sying/toolchain_ljhui/gcc4_9/arm-hisiv500-linux/gcc-uclibc/install/host_lib --with-libelf=/home/sying/toolchain_ljhui/gcc4_9/arm-hisiv500-linux/gcc-uclibc/install/host_lib --enable-libgomp --disable-libitm --disable-libsanitizer --enable-poison-system-directories --with-libelf=/home/sying/toolchain_ljhui/gcc4_9/arm-hisiv500-linux/gcc-uclibc/install/host_lib --with-pkgversion=Hisilicon_v500_20180120 --with-bugurl=http://www.hisilicon.com/cn/service/claim.html
Thread model: posix
gcc version 4.9.4 20150629 (prerelease) (Hisilicon_v500_20180120) 


从编译器信息里可以看出,这个编译器是uclibc, uclibc是经过裁剪的c库,这个编译器可能不支持c++11的thread类;


替换为posix 的thread api创建线程测试是可以的。


问题解决了。

目录
相关文章
|
机器学习/深度学习 测试技术
大模型开发:描述交叉验证以及为什么在模型评估中使用它。
【4月更文挑战第24天】交叉验证是评估机器学习模型性能的方法,通过将数据集分成训练集和多个子集(折叠)进行多次训练验证。它能减少过拟合风险,提供更可靠的性能估计,用于参数调优,并减少小数据集或噪声带来的随机性影响。通过汇总多轮验证结果,得到模型的整体性能估计。
866 7
源文件与模块生成时的文件不同,是否希望调试器使用它?如何解决
源文件与模块生成时的文件不同,是否希望调试器使用它?如何解决
|
Web App开发 安全 Linux
FFmpeg开发笔记(二十六)Linux环境安装ZLMediaKit实现视频推流
《FFmpeg开发实战》书中介绍轻量级流媒体服务器MediaMTX,但其功能有限,不适合生产环境。推荐使用国产开源的ZLMediaKit,它支持多种流媒体协议和音视频编码标准。以下是华为欧拉系统下编译安装ZLMediaKit和FFmpeg的步骤,包括更新依赖、下载源码、配置、编译、安装以及启动MediaServer服务。此外,还提供了通过FFmpeg进行RTSP和RTMP推流,并使用VLC播放器拉流的示例。
3032 3
FFmpeg开发笔记(二十六)Linux环境安装ZLMediaKit实现视频推流
|
NoSQL 架构师 Java
2024软考架构师考试---分布式锁的实现方式有那些以及优缺点
【6月更文挑战第16天】在分布式系统中,分布式锁是一种用于控制对共享资源访问的机制,以确保多进程、多线程环境下的数据一致性。分布式锁有多种实现方式,本文将介绍几种常见的分布式锁及其优缺点。
797 1
|
NoSQL Linux C语言
# windows安装gcc、g++、pthread
# windows安装gcc、g++、pthread
2113 0
|
存储 安全 数据库连接
【C++智能指针】深入探究C++智能指针:自定义删除器的设计与选择
【C++智能指针】深入探究C++智能指针:自定义删除器的设计与选择
1244 0
|
Linux Perl
如何在Linux中高效查找大文件
在Linux中查找大文件的方法包括使用find(如`find /path/to/search -size 100M`查找100MB文件),du(如`du -ah /path/to/search | awk '$1 ~ /M$/ && $1 > 100 {print}'`查找大于100MB的文件),ls结合排序(如`ls -lhS /path/to/search | head -n 10`显示最大10个文件)和GUI工具(Nautilus、Thunar等)。选择方法要考虑查找范围、结果需求和用户熟悉程度。注意权限和验证结果,参考相关文档以获取更多帮助。
2154 0
搭建esp32-idf开发环境并烧入第一个程序
搭建esp32-idf开发环境并烧入第一个程序
1298 0
|
C++
QT图形视图系统 - 使用一个项目来学习QT的图形视图框架 - 始篇
详细的介绍可以看QT的官方助手,那里面介绍的详细且明白,需要一定的英语基础,我这里直接使用一个开源项目来介绍QGraphicsView、QGraphicsScene的使用。
1006 1
|
C++
C++错误解决办法:pure virtual method called
C++错误解决办法:pure virtual method called
865 0