C++ 程序抛异常产生的 core 文件,无法显示正确的函数调用栈信息(备忘)

2023-11-15

问题

比如,如下程序:

#include <thread>
#include <string>
#include <chrono>

int f()
{
        throw int(1);
}

int f2()
{
        f();
}

int main()
{
        std::thread t2(f2);
        t2.join();
}

编译,执行:

g++ main.cpp -o test -std=c++11 -pthread
./test

会产生 core 文件:

[fananchong@host-192-168-21-22 bin]$ gdb test core.15501
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-80.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/fananchong/valkyrie/Runtime_ZT_QA/bin/test...(no debugging symbols found)...done.
[New LWP 15502]
[New LWP 15501]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
Core was generated by `./test'.
Program terminated with signal 6, Aborted.
#0  0x00007fe0b6db3337 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:55
55        return INLINE_SYSCALL (tgkill, 3, pid, selftid, sig);
(gdb) bt
#0  0x00007fe0b6db3337 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:55
#1  0x00007fe0b6db4a28 in __GI_abort () at abort.c:90
#2  0x00007fe0b78df7d5 in __gnu_cxx::__verbose_terminate_handler () at ../../../../libstdc++-v3/libsupc++/vterminate.cc:95
#3  0x00007fe0b78dd746 in __cxxabiv1::__terminate (handler=<optimized out>) at ../../../../libstdc++-v3/libsupc++/eh_terminate.cc:38
#4  0x00007fe0b78dd773 in std::terminate () at ../../../../libstdc++-v3/libsupc++/eh_terminate.cc:48
#5  0x00007fe0b7934105 in std::(anonymous namespace)::execute_native_thread_routine (__p=<optimized out>) at ../../../../../libstdc++-v3/src/c++11/thread.cc:92
#6  0x00007fe0b7152e65 in start_thread (arg=0x7fe0b6d7c700) at pthread_create.c:307
#7  0x00007fe0b6e7b88d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111
(gdb)

无法正确显示 f() 出现异常

解决方法

解决方法很多,根据项目情况,最佳方法为, 增加 noexcept 关键字

如下:

#include <thread>
#include <string>
#include <chrono>

int f()
{
        throw int(1);
}

int f2() noexcept
{
        f();
}

int main()
{
        std::thread t2(f2);
        t2.join();
}

编译,执行:

g++ main.cpp -o test -std=c++11 -pthread
./test

会产生 core 文件:

[fananchong@host-192-168-21-22 bin]$ gdb test core.12905
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-80.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/fananchong/valkyrie/Runtime_ZT_QA/bin/test...(no debugging symbols found)...done.
[New LWP 12906]
[New LWP 12905]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
Core was generated by `./test'.
Program terminated with signal 6, Aborted.
#0  0x00007f3683482337 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:55
55        return INLINE_SYSCALL (tgkill, 3, pid, selftid, sig);
(gdb) bt
#0  0x00007f3683482337 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:55
#1  0x00007f3683483a28 in __GI_abort () at abort.c:90
#2  0x00007f3683fae7d5 in __gnu_cxx::__verbose_terminate_handler () at ../../../../libstdc++-v3/libsupc++/vterminate.cc:95
#3  0x00007f3683fac746 in __cxxabiv1::__terminate (handler=<optimized out>) at ../../../../libstdc++-v3/libsupc++/eh_terminate.cc:38
#4  0x00007f3683fab6f9 in __cxa_call_terminate (ue_header=0x7f367c000920) at ../../../../libstdc++-v3/libsupc++/eh_call.cc:54
#5  0x00007f3683fac364 in __cxxabiv1::__gxx_personality_v0 (version=<optimized out>, actions=<optimized out>, exception_class=<optimized out>, ue_header=<optimized out>,
    context=<optimized out>) at ../../../../libstdc++-v3/libsupc++/eh_personality.cc:676
#6  0x00007f3683a458a3 in _Unwind_RaiseException_Phase2 (exc=exc@entry=0x7f367c000920, context=context@entry=0x7f368344ab90) at ../../../libgcc/unwind.inc:62
#7  0x00007f3683a45c3b in _Unwind_RaiseException (exc=0x7f367c000920) at ../../../libgcc/unwind.inc:131
#8  0x00007f3683fac986 in __cxxabiv1::__cxa_throw (obj=0x7f367c000940, tinfo=0x604120 <_ZTIi@@CXXABI_1.3>, dest=0x0) at ../../../../libstdc++-v3/libsupc++/eh_throw.cc:82
#9  0x0000000000400df6 in f() ()
#10 0x0000000000400dff in f2() ()
#11 0x00000000004020f9 in int std::_Bind_simple<int (*())()>::_M_invoke<>(std::_Index_tuple<>) ()
#12 0x0000000000402053 in std::_Bind_simple<int (*())()>::operator()() ()
#13 0x0000000000401fec in std::thread::_Impl<std::_Bind_simple<int (*())()> >::_M_run() ()
#14 0x00007f3684003070 in std::(anonymous namespace)::execute_native_thread_routine (__p=<optimized out>) at ../../../../../libstdc++-v3/src/c++11/thread.cc:84
#15 0x00007f3683821e65 in start_thread (arg=0x7f368344b700) at pthread_create.c:307
#16 0x00007f368354a88d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111
(gdb) quit

该 core 文件, 第 #10 #9 #8 正确显示了 f() 内抛出了异常

参考资料

以上有同事给出的解决方案,主要参考至:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55917
https://zhuanlan.zhihu.com/p/59554240

里面讨论给出了多种解决方法

以上

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 程序抛异常产生的 core 文件,无法显示正确的函数调用栈信息(备忘) 的相关文章

  • 使用 AWK 或 SED 以及以下标签以逗号分隔

    使用 AWK 或 SED 以及下面使用的标签以逗号分隔 BEGIN AccountID BEGIN CallerID BEGIN Billed Account Attributes 1111111 1111111 1111111 END B
  • 更改子进程中的 iostream

    现在 我正在开发一个项目 其中我需要启动一个子进程来使用 C 在 Linux 中执行一个新程序 并且我需要重定向标准输入和输出 就像在 C 中一样 它们是cin and cout 到一个文件 这意味着在子进程中 标准输入和输出都是文件 子进
  • 获取当前时间(以小时和分钟为单位)

    我正在尝试从系统收集信息 并且需要获取当前时间 以小时和分钟为单位 目前我有 date awk print 4 输出如下 16 18 54 怎样才能把秒数去掉呢 提供格式字符串 date H M Running man date将给出所有格
  • PyGTK+3(PyGObject)创建屏幕截图?

    我过去 3 天在 google 上搜索 如何使用 PyGTK 3 创建屏幕截图 有关于 pyqt pygtk 2 wx 和 PIL 的 gallizion 教程 顺便说一句 我不需要 scrot imlib2 imagemagick 等外部
  • Ubuntu 上的 Docker 无法连接到本地主机,但可以连接到其 IP

    我运行的是 Ubuntu 18 04 uname r 5 3 0 46 generic 我已经安装了docker docker version Docker version 19 03 8 build afacb8b7f0 我有一个简单的
  • 为所有图像添加前缀(递归)

    我有一个包含 5000 多张图像的文件夹 全部带有 JPG 扩展名 我想要做的就是递归地向所有图像添加 thumb 前缀 我发现了一个类似的问题 重命名文件和目录 添加前缀 https stackoverflow com questions
  • 如何在Linux中打开端口[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我已经安装了 Web 应用程序 该应用程序在 RHEL centOS 上的端口 8080 上运行 我只能通过命令行访问该机器 我尝试从我的
  • 无法使用Linux服务启动Archiva 2.1.0

    我正在尝试在 Linux 上启动最近发布的 Apache Archiva v2 1 0 独立版 出于测试目的 该 zip 已解压缩在 opt archiva 2 0 文档说 http archiva apache org docs 2 1
  • 为什么 Solaris 汇编器生成的机器代码与 GNU 汇编器在这里不同?

    我为 amd64 编写了这个小汇编文件 对于这个问题来说 代码的作用并不重要 globl fib fib mov edi ecx xor eax eax jrcxz 1f lea 1 rax ebx 0 add rbx rax xchg r
  • Node exec 无权执行脚本

    直到最近 它都运行良好 但是当我今天尝试使用它时 它无法正常运行 它返回以下错误 错误 命令失败 bin sh c home pi RPi Computer Power RPi Server routes scripts hash js 1
  • Amazon EC2 - Apache 服务器重启问题

    当我运行这个命令时 sudo etc init d httpd restart 它给出以下错误 停止 httpd 失败 启动 httpd 98 地址已在使用中 make sock 无法绑定到地址 80 98 地址已在使用 make sock
  • 在 UNIX 时间戳 Shell/Bash 中将日期与时区转换

    我需要将日期从格式为 yyyy mm dd hh mm ss TZ 的字符串转换为 UNIX 时间 TZ 时区 到目前为止我所做的是将没有时区的 yyyy mm dd hh mm ss 格式的日期转换为时间戳 dateYMD 2019 2
  • 使用正在运行的进程的共享内存收集核心转储

    核心转储仅收集进程空间 而不收集为进程间通信创建的共享内存 如何使核心转储也包含正在运行的进程的共享内存 设置核心文件过滤器 proc PID coredump filter per http man7 org linux man page
  • 使用 Shell 脚本提供密码

    我已将客户端和服务器设置为无密码登录 就像无密码登录一样 通过将服务器的 RSA 密钥复制到所有客户端的 root ssh id rsa pub 来实现 但这是我手动完成的 我喜欢使用 shell 脚本自动执行此过程 并通过脚本向计算机提供
  • 如何检测文本文件中大于 n 的一系列“空洞”(孔、与模式不匹配的线)?

    Case scenario cat Status txt 1 connected 2 connected 3 connected 4 connected 5 connected 6 connected 7 disconnected 8 di
  • 什么是接口标识符

    我有一台笔记本电脑 使用一个或多个网络适配器连接到我组织的网络 我正在尝试编写一个工具来持续监控每个网络的连接状态和连接质量 然而 我的网络知识有限 术语让我感到困惑 特别是查找所有网络适配器 有人建议我使用命令ifconfig它给了我所谓
  • Web 本地应用程序 Apache:运行 shell 脚本

    我开发了一个 shell 脚本 我想用它创建一个 UI 我决定使用带有本地服务器的 Web 界面 因为我对 HTML PHP 的了解很少 比 QT 或 Java 的了解更多 我只是希望我的 html 可以在我的计算机上运行 shell 脚本
  • 每当调用 malloc/free 时输出到 stderr

    使用 Linux GCC C 每当调用 malloc free new delete 时 我想向 stderr 记录一些内容 我试图了解库的内存分配 因此我想在运行单元测试时生成此输出 我使用 valgrind 进行内存泄漏检测 但我找不到
  • 数百个空闲线程的影响

    我正在考虑使用可能数百个线程来实现通过网络管理设备的任务 这是一个在带有 Linux 内核的 powerpc 处理器上运行的 C 应用程序 在每个任务进行同步以将数据从设备复制到任务的初始阶段之后 任务变得空闲 并且仅在收到警报或需要更改一
  • 从 Java 读取 /dev/input/js0

    我正在尝试阅读 dev input js0来自Java 但我不断得到 java io IOException Invalid argument at java io FileInputStream read0 Native Method a

随机推荐

  • 【Node.js实战】一文带你开发博客项目之登录(对接完毕,cookie、session、redis各司其职)

    个人简介 个人主页 前端杂货铺 学习方向 主攻前端方向 也会涉及到服务端 个人状态 在校大学生一枚 已拿多个前端 offer 秋招 未来打算 为中国的工业软件事业效力n年 推荐学习 前端面试宝典 Vue2 Vue3 Vue2 Vue3项目实
  • 22年美赛c题-交易策略

    目录 题目 前言 数据预处理 模型假设 第一问 总体思路 预测模型 评价指标 MACD 评价指标 RSI 评价指标3 预测模型 层次分析法 AHP 交易模型 第二问 第三问 模型的不足 题目 开发一个模型 该模型仅基于当天的价格数据提供最佳
  • 2022护网日记,护网工作内容、护网事件、告警流量分析

    作者主页 士别三日wyx 作者简介 CSDN top100 阿里云博客专家 华为云享专家 网络安全领域优质创作者 2022护网日记 一 监控设备 二 工作内容 三 安全事件 1 失陷主机排查 2 后门网站修复 四 告警流量分析 1 信息泄露
  • 7-4 快速排序

    7 4 快速排序 20 分 注 由于是用map计数暴力实现的 所以当数据量大的时候就会WA 众所周知 Keven是一个ACMer 他今天刚刚学会了快速排序 他非常开心 因为他可以快速的找到区间第K小的数字了 但是同为ACMer的JOJO看不
  • Linux系统下查看被杀死进程的信息

    通过dmesg 命令分析原因 软件在运行时显示 进程被杀死 首先通过命令查看被杀死的进程的情况 dmesg egrep i B100 killed process 显示 在被杀死的时候该进程占用的内存 22588 717326 Killed
  • string的length()与size()方法有什么区别

    正如文档http en cppreference com w cpp string basic string中所述 string的length 和size 方法只是同义词而已 size 方法与其他的STL容器一致 比如vector map等
  • 数据库和缓存双写一致性

    文章目录 前言 1 常见方案 2 先写缓存 再写数据库 3 先写数据库 再写缓存 3 1 写缓存失败了 3 2 高并发下的问题 3 3 浪费系统资源 4 先删缓存 再写数据库 4 1 高并发下的问题 4 2 缓存双删 5 先写数据库 再删缓
  • 锐捷交换机生成树

    生成树 Ruijie config spanning tree 打开Spanning Tree协议 锐捷设备默认起开了STP Ruijie config spanning tree mode mstp rstp stp 切换Spanning
  • Java学习之Struts 2.x

    与传统的Struts1 x相比 Struts2 x允许使用更普通的 传统的Java对象作为Action Action的execute方法不再与Servlet API耦合 因而更易测试 支持更多的视图技术 基于AOP思想的拦截器机制 提供了极
  • Downloading C/C++ language components (Linux / x86_64)

    Problem The report from vscode as shown in the title cannot be canceled and keep showing there This happens when I am tr
  • Linux 安装gcc和运行代码(Ubuntu为例)

    目录 一 安装gcc 二 gcc编译 运行代码 首先检测网络连通性 一 安装gcc 1 打开虚拟机终端 安装gcc 输入 sudo apt install gcc 2 安装完成后检查 输入 gcc version 如果出现以下内容 则说明安
  • 基于沙猫群优化算法的线性规划求解matlab程序

    基于沙猫群优化算法的线性规划求解matlab程序 1 沙猫群优化算法 沙猫的中文学名叫沙丘猫 俗名沙漠猫 与荒漠猫名字相似 但却是两种不同的猫科动物 沙猫生活在茫茫沙漠里 主要分布在分布于非洲北部 阿拉伯半岛中部和西南亚 沙猫的家园 是贫瘠
  • Node.js 从零开发 web server博客项目[koa2重构博客项目]

    web server博客项目 Node js 从零开发 web server博客项目 项目介绍 Node js 从零开发 web server博客项目 接口 Node js 从零开发 web server博客项目 数据存储 Node js
  • 【Python脚本抢红包】用Python写了一个自动抢红包工具,今年过年准备大干一场

    话说又要过年了 现在过年可没有小时候的味道了 小时候只顾着放鞭炮 现在只顾着各个群里蹲红包 但是手动抢肯定没戏 毕竟手can谁也没办法 那就只能试试能不能通过编程的方式实现自动化抢红包了 跟小编一样财迷的铁汁们 可以往下滑了 代码文末可取
  • 基于计算机视觉的智能制造:实现对智能制造的实时监控和调度

    作者 禅与计算机程序设计艺术 1 简介 智能制造 Intelligent Manufacturing 是在不断进步的科技和技术领域里 将智能技术应用到制造领域中去 实现机器 设备 材料的自动化和精准化过程 提升生产效率 降低成本 节约能源和
  • ESX虚拟机克隆后提示设备"0"的配置无效

    一般是克隆后mac地址与原网卡mac地址不符导致的 解决办法 下载虚拟机 vmx文件 修改其中的跟网卡eth0相关的mac地址跟实际mac相符 实在不行就删除网卡0 再添加一块网卡 有时候网卡驱动类型不符也不会报类似的错误 虚拟网卡一般有三
  • 区块链100讲:Hyperledger Fabric 中的链码(智能合约)

    1 链码概念 网络运行环境我们已经启动完成 现在我们从开发者的角度来认识一下完成交易所必须的智能合约 在 Hyperledger Fabric 中被称之为 Chaincode 也就是链上代码 的相关知识 以便于理解账本中的数据到底是通过什么
  • Windows 找不到文件 ‘gpedit.msc‘。请确定文件名是否正确后,再试一次。(已解决)

    今天在使用命令gpedit msc打开组策略编辑器报错 Windows 找不到文件 gpedit msc 请确定文件名是否正确后 再试一次 离谱 我都没改过设置什么的 后来找到解决办法 重新安装 桌面新建txt文档 文档里输入内容 echo
  • 程序员-接单网站

    远程工作平台 1 靠山云 https www kaoshanyun com 靠山云平台新型远程办公兼职平台 为中高端程序员 产品经理和设计师等等互联网相关人员提供稳定的线上工作机会 包括自由工作 远程工作和兼职工作 还支持按需雇佣 工作模式
  • C++ 程序抛异常产生的 core 文件,无法显示正确的函数调用栈信息(备忘)

    问题 比如 如下程序 include