在c++里,如果在Thread中有未捕获的异常,那么gcc会主动catch该异常,从而导致函数栈中无有用的信息。

下面是一个例子

#include <stdexcept>
#include <thread>
void foo()
{throw std::runtime_error("foo");
}void subroutine() {std::thread t(foo);t.join();
}int main()
{std::thread t(subroutine);t.join();
}

这里仅仅指的是c++中定义的异常,以及子类;如果是错误,比如说除以零,这种是可以直接抛出来的

使用编译命令

g++ -Wall -std=c++0x -g tmp.cpp

然后使用gdb执行

gdb a.out(gdb) r
Using host libthread_db library "/lib64/libthread_db.so.1".
[New Thread 0x7ffff7dc1700 (LWP 2427)]
terminate called after throwing an instance of 'std::runtime_error'what():  foo

运行bt调出函数栈信息,发现没有有效的内容

   Program received signal SIGABRT, Aborted.[Switching to Thread 0x7ffff7dc1700 (LWP 2427)]0x00000034906362a5 in raise () from /lib64/libc.so.6Missing separate debuginfos, use: debuginfo-installboost-thread-1.47.0-3.fc16.x86_64 glibc-2.14.90-14.x86_64libgcc-4.6.2-1.fc16.x86_64 libstdc++-4.6.2-1.fc16.x86_64(gdb) bt#0  0x00000034906362a5 in raise () from /lib64/libc.so.6#1  0x0000003490637bbb in abort () from /lib64/libc.so.6#2  0x000000349aabbf8d in __gnu_cxx::__verbose_terminate_handler()() from /usr/lib64/libstdc++.so.6#3  0x000000349aaba146 in ?? () from /usr/lib64/libstdc++.so.6#4  0x000000349aaba173 in std::terminate() () from/usr/lib64/libstdc++.so.6#5  0x000000349aa70bdb in ?? () from /usr/lib64/libstdc++.so.6#6  0x0000003490a07d90 in start_thread () from /lib64/libpthread.so.0#7  0x00000034906eeddd in clone () from /lib64/libc.so.6

解决方案

  1. 改用boost::thread
#include <stdexcept>
#include <thread>
void foo()
{throw std::runtime_error("foo");
}void subroutine() {boost::thread t(foo);t.join();
}int main()
{boost::thread t(subroutine);t.join();
}
  1. 改用pthread
#include <stdexcept>
//#include <thread>
void *foo(void *)
{throw std::runtime_error("foo");
}void *subroutine(void *a) {pthread_t thread_id;pthread_create(&thread_id, NULL, foo, NULL);pthread_join(thread_id,NULL);return NULL;
}int main()
{pthread_t thread_id;pthread_create(&thread_id, NULL, subroutine, NULL);pthread_join(thread_id,NULL);return 0;
}

这时的函数栈可以显示到对应的crash函数了

#0  0x00007f1b7840b1f7 in raise () from /lib64/libc.so.6
#1  0x00007f1b7840c8e8 in abort () from /lib64/libc.so.6
#2  0x00007f1b78d11a95 in __gnu_cxx::__verbose_terminate_handler() ()from /lib64/libstdc++.so.6
#3  0x00007f1b78d0fa06 in ?? () from /lib64/libstdc++.so.6
#4  0x00007f1b78d0fa33 in std::terminate() () from /lib64/libstdc++.so.6
#5  0x00007f1b78d0fc53 in __cxa_throw () from /lib64/libstdc++.so.6
#6  0x00000000004007bb in foo ()at main.cpp:5
#7  0x00007f1b78fc0e25 in start_thread () from /lib64/libpthread.so.0
#8  0x00007f1b784ce34d in clone () from /lib64/libc.so.6
  1. 按照这里介绍的在函数上使用noexcept修饰 (但是好像不行)
  2. 更换未gcc8

参考链接

  1. https://blog.csdn.net/u013272009/article/details/101458409
  2. https://gcc.gnu.org/legacy-ml/gcc-help/2011-11/msg00140.html
  3. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55917
  4. https://zhuanlan.zhihu.com/p/59554240

gcc8之前,coredump文件无法显示正确的函数调用栈信息相关推荐

  1. VideoCapture 读取视频文件,显示视频(帧)信息

    #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <ope ...

  2. aspx文件上传表单内容到另一个aspx文件,但后续文件无法显示出接收到的信息,大佬们该咋办

    我建立了两个aspx文件,其中一个为填写表单信息的网站,在填写完成后点击提交就会将表单信息上传到第二个asox文件中,并且在该网站的界面中显示出来.但并没有,试过了多个浏览器,代码也基本没问题.求助各 ...

  3. Jupyter notebook导出的html文件不能够正确显示图片

    Jupyter notebook导出的html文件不能够正确显示图片 文章目录: 1 jupyter notebook显示图片方式 1.1 在code模式下 1.2 在Markdown模式下 2 up ...

  4. 打开chm文件不能显示内容的解决办法

    小知识: CHM 意为 Compiled HTML.以CHM为扩展名的文件图标通常为一个带问号的文档图标,表示帮助文档,是 Microsoft 自 Windows 98 以来提供的一种帮助文档格式的文 ...

  5. Linux调试——gdb调试器的简单使用调试coredump文件

    文章目录 一.背景 二.gdb的指令与使用 1.gdb的基本指令. 2.gdb指令的简单使用 1.进入gdb模式 2.实例说明 三.调试coredump文件 前提:本质上是在调试程序崩溃之后的内存镜像 ...

  6. visual studio 怎么生成coredump文件_coredump详解

    一,什么是coredump 我们经常听到大家说到程序core掉了,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满足一定条件下(这里为什么说需要 ...

  7. win10安装Offic2016以后,Word文件、Excel文件、PPT文件图标显示不正常解决方法

    当安装Office以后,会因为注册表还是上一个软件的设定值,导致文件找不到对应的图标而无法正常显示,尤其在你上一个office软件用的是WPS的情况下,相关注册表的值会被修改为WPS图标值,但是当WP ...

  8. html打开xls文件并显示其内容 demo

    html打开xls文件并显示其内容 表格内容: html显示: 代码: <!DOCTYPE html> <html> <head><title>test ...

  9. 删除文件时显示该文件不在此文件夹中的原因

    问题描述 删除文件时显示该文件不在此文件夹中,在网上搜索资料都是新建一个bat通过拖拽删除. 但是具体为什么无法删除并没有说明,于是我通过排除法,一步步删除子文件夹,直到找到无法删除的文件. 原因分析 ...

最新文章

  1. angularjs源码笔记(3)--injector
  2. 免费学python的网站-python自学网站
  3. Linux Kernel系列三:Kernel编译和链接中的linker script语法详解
  4. myisam表锁及锁粒度调节
  5. Java zip解压,并遍历zip中的配置文件 .cfg或.properties
  6. session-cookie 和token登录验证
  7. Composite UI Application Block学习笔记之Event Broker
  8. 微信红包封面小程序源码-后台独立版-带测评积分功能源码
  9. Redis数据结构之列表
  10. JS中比较两个对象是否相等
  11. 【Spring】actual transaction available for current thread - cannot reliably process ‘remove‘ call
  12. qt撤销与回退_Git撤销某次分支的合并Merge
  13. TIOBE 8 月编程语言排行榜:Python 奋力追赶 C,Swift 下跌
  14. 【机器学习】鸢尾花数据探索
  15. PHP中preg_match_all正则匹配出需要的内容
  16. 安卓post 提交图片流和字符数据
  17. Linux 日志查看常用命令
  18. html动态背景gif图片,gif动态背景
  19. 清华大学--代理服务器
  20. 交换机怎么用计算机配置文件,如何将交换机配置导入本地计算机做备份

热门文章

  1. Linux(64位)下OpenBabel 2.4.1、python2.7和Ipython实战(三)
  2. Scanpy(四).细胞分化轨迹推断
  3. apache mysql 连接数_浏览器端同时请求100个url后,如何提升有效的msyql连接数
  4. Python 中常见的 TypeError 是什么?
  5. QIIME 2用户文档. 21图形界面q2studio(2019.7)
  6. 2019微生物组—宏基因组分析专题培训第三期
  7. PNAS-皮肤微生物群综合分析揭示人类皮肤的独特性并为其在哺乳动物的系统发育共生现象提供证据
  8. oracle分区表执行计划分区合并,利用ORACLE分区技术提高管理和性能_PART2
  9. pandas编写自定义函数计算多个数据列的加和(sum)、使用groupby函数和apply函数聚合计算分组内多个数据列的加和
  10. R语言使用magick包的image_annotate函数在图片中添加文本标签信息、自定义文本标签内容的位置、色彩(Text annotations)