Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在Mac上抛取GCC异常的SIGABRT

在Mac上抛取GCC异常的SIGABRT
EN

Stack Overflow用户
提问于 2020-12-16 05:08:25
回答 1查看 549关注 0票数 5

我目前正在维护的C++库中进行正确的错误管理。当为某些阴性情况编写单元测试(即测试正确抛出异常)时,单元测试套件简单地用SIGABRT中止。我进行了一次搜索,试图将错误归结为简单的异常,抛出更简单的异常,并尝试各种catch语句。但是,即使是一个无所不包的块也无法防止坠机( MWE见下文)。

我的设置是这样的:我正在使用最新的OSXBigSu11.1和最新的XCode命令行工具来开发Mac。我用的是来自家酿的GCC,现在是v10.2.0_1。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ g++-10 -v
Using built-in specs.
COLLECT_GCC=g++-10
COLLECT_LTO_WRAPPER=/usr/local/Cellar/gcc/10.2.0_1/libexec/gcc/x86_64-apple-darwin20/10.2.0/lto-wrapper
Target: x86_64-apple-darwin20
Configured with: ../configure --build=x86_64-apple-darwin20 --prefix=/usr/local/Cellar/gcc/10.2.0_1 --libdir=/usr/local/Cellar/gcc/10.2.0_1/lib/gcc/10 --disable-nls --enable-checking=release --enable-languages=c,c++,objc,obj-c++,fortran --program-suffix=-10 --with-gmp=/usr/local/opt/gmp --with-mpfr=/usr/local/opt/mpfr --with-mpc=/usr/local/opt/libmpc --with-isl=/usr/local/opt/isl --with-system-zlib --with-pkgversion='Homebrew GCC 10.2.0_1' --with-bugurl=https://github.com/Homebrew/homebrew-core/issues --disable-multilib --with-native-system-header-dir=/usr/include --with-sysroot=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk SED=/usr/bin/sed
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 10.2.0 (Homebrew GCC 10.2.0_1)

我也用苹果系统工具链编译了GCC本人。自编GCC的成果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ /opt/gcc/10.2.0/bin/g++-10 -v
Using built-in specs.
COLLECT_GCC=/opt/gcc/10.2.0/bin/g++-10
COLLECT_LTO_WRAPPER=/opt/gcc/10.2.0/libexec/gcc/x86_64-apple-darwin20/10.2.0/lto-wrapper
Target: x86_64-apple-darwin20
Configured with: ../configure --build=x86_64-apple-darwin20 --prefix=/opt/gcc/10.2.0 --libdir=/opt/gcc/10.2.0/lib/gcc/10 --disable-nls --enable-checking=release --enable-languages=c,c++,objc,obj-c++,fortran --program-suffix=-10 --with-system-zlib --disable-multilib --with-native-system-header-dir=/usr/include --with-sysroot=/Library/Developer/CommandLineTools/SDKs/MacOSX11.1.sdk SED=/usr/bin/sed
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 10.2.0 (GCC)

结果仍然相同:异常中止程序。

我最起码的工作例子是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <stdexcept>

int main()
{
    try {
        throw "this is an exception text";
    }
    catch(const char* e)
    {
        std::cerr << e << std::endl;
    }
    catch(...)
    {
        std::cerr << "Unknown error!" << std::endl;
    }

    return 0;
}

这可以很好地编译,并在我的Linux上产生预期的输出。

我使用以下命令在我的Mac上编译它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ g++-10 -o bin/main.o -c -std=c++11 main.cpp
$ g++-10 -o bin/main bin/main.o
$ ./bin/main
[1]    60310 abort      ./bin/main

使用LLDB产量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(lldb) run
Process 61177 launched: './bin/main' (x86_64)
Process 61177 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGABRT
    frame #0: 0x00007fff202fa462 libsystem_kernel.dylib`__pthread_kill + 10
libsystem_kernel.dylib`__pthread_kill:
->  0x7fff202fa462 <+10>: jae    0x7fff202fa46c            ; <+20>
    0x7fff202fa464 <+12>: movq   %rax, %rdi
    0x7fff202fa467 <+15>: jmp    0x7fff202f46a1            ; cerror_nocancel
    0x7fff202fa46c <+20>: retq   
Target 0: (main) stopped.
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGABRT
  * frame #0: 0x00007fff202fa462 libsystem_kernel.dylib`__pthread_kill + 10
    frame #1: 0x00007fff20328610 libsystem_pthread.dylib`pthread_kill + 263
    frame #2: 0x00007fff2027b720 libsystem_c.dylib`abort + 120
    frame #3: 0x000000010048b00a libgcc_s.1.dylib`uw_init_context_1.cold + 5
    frame #4: 0x0000000100488475 libgcc_s.1.dylib`_Unwind_RaiseException + 69
    frame #5: 0x00000001001382f7 libstdc++.6.dylib`__cxa_throw + 55
    frame #6: 0x0000000100003d55 main`main + 52
    frame #7: 0x00007fff20343621 libdyld.dylib`start + 1

在我看来,似乎另一个错误发生在展开阶段,然后导致终止。这也解释了为什么从来没有到达catch块。

这超出了我的专业范围,所以任何想法都是受欢迎的。

编辑:最新问题后GCC自制版。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-11 01:25:02

我证实了意外行为的大苏尔,自制GCC 10.2.0_2设置。将链接的brew libstdc++改为system (假设/usr/lib中找到的brew是由macOS安装的)解决了我的设置上的问题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ g++-10 main.cpp -o main -std=c++11
$ ./main
Abort trap: 6
$ otool -L main
main:
    /usr/local/opt/gcc/lib/gcc/10/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.28.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1292.60.1)
    /usr/local/lib/gcc/10/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
$ install_name_tool -change /usr/local/opt/gcc/lib/gcc/10/libstdc++.6.dylib /usr/lib/libstdc++.6.dylib main
$ ./main
this is an exception text

或者,在运行export DYLD_LIBRARY_PATH=/usr/lib之前设置main具有相同的效果。

更新:,bug是固定,该补丁包含在brew的gcc-10.2.0_3中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65323946

复制
相关文章
异常要怎么抛?
上一章,我们一起学习了打日志的点点滴滴,很多同学跟我反馈,自己好像从来没打对过日志,也有同学跟我吐槽,MD,最讨厌那些吞异常的SX。
彤哥
2021/02/02
1.4K0
领域服务上抛异常还是返回错误码
在 C 语言中,错误码的返回方式有两种:一种是直接占用函数的返回值,函数正常执行的返回值放到出参中;另一种是将错误码定义为全局变量,在函数执行出错时,函数调用者通过这个全局变量来获取错误码
码农戏码
2022/06/07
7870
dotnet C# 在 finally 抛异常会发生什么
如果我在一个方法的 finally 里面抛出异常,而在 try 里面也抛出,那在上层拿到的是什么
林德熙
2021/12/24
3230
如何在mac上查看gcc版本号[通俗易懂]
linux能够很方便得查看gcc版本号,只需要输入gcc –version就能得到如下结果,能一目了然gcc版本是4.9.2
全栈程序员站长
2022/09/13
2.1K0
执行ArrayList的remove(object)方法抛异常?
然后会发现抛出java.util.ConcurrentModificationException异常,这是一个并发异常。那么这个到底是什么情况?首先需要介绍一下增强for循环
Johnson木木
2020/07/13
8210
Java 枚举查找并不抛异常的实现
Java Enum是一个非常有用的功能,但很多人通常并不能充分利用,这是因为一些库不会优先择用该功能。通常我们也可以正确使用Java枚举功能,但在许多代码库中往往存在着这样一个问题,于是有了这篇文章。问题很简单:我们应该如何通过名称或值获取枚举,并忽略不存在的值?
哲洛不闹
2018/09/14
2.3K0
Java 枚举查找并不抛异常的实现
list强转数组抛异常-ClassCastException
toArray(new String[0]), 创建一个大小为0的数组,当为输入数组长度小于集合size时,toArray方法会自动创建一个等大数组放入数据并返回。 toArray(new String[100000]),同上输入的10w数组比集合size小,toArray方法会重新创建一个等大数组放入数据并返回,原来的10w数组等于白建了 toArray(new String[1000000]),输入数组长度与集合size相等,当是一个理想状态时,即数组size没有发生变化(比如没有并发情况),那么toArray方法会直接使用输入数组并返回,但如果在输入数组创建之后,原集合size发生了变化,最糟糕的情况会退化为#2 toArray(new String[2000000]),输入数组长度大于集合size,那么toArray方法会直接使用输入数组并返回,当然多出去的那部分数组量就算浪费了
用户1503405
2021/10/06
5080
phabricator在mac上的搭建
前提:phabricator主要是由php写的,而且是以website方式运行的,所以mac上要先安装好 php + nginx(或apache) + mysql(很多配置会保存在数据库里)
菩提树下的杨过
2018/09/20
1.8K0
phabricator在mac上的搭建
Spring Security中异常上抛机制及对于转型处理的一些感悟
在使用Spring Security的过程中,我们会发现框架内部按照错误及问题出现的场景,划分出了许许多多的异常,但是在业务调用时一般都会向外抛一个统一的异常出来,为什么要这样做呢,以及对于抛出来的异常,我们又该如何分场景进行差异化的处理呢,今天来跟我一起看看吧。
翎野君
2023/05/12
3610
Spring Security中异常上抛机制及对于转型处理的一些感悟
gcc在Ubuntu上安装和使用「建议收藏」
使用命令sudo apt install build-essential,该命令将安装一堆新包,包括gcc,g ++和make。 要验证GCC编译器是否已成功安装,可以使用gcc -v命令打印GCC版本:
全栈程序员站长
2022/09/15
1.5K0
gcc在Ubuntu上安装和使用「建议收藏」
不要用抛异常做流程控制
最近,无意中看到了别人的某段代码,是用抛出异常的方式去控制代码逻辑和流程。
Coder的技术之路
2021/05/14
1.2K1
不要用抛异常做流程控制
django2.0+反向查询抛异常处理
一.错误信息 AttributeError: 'RelatedManager' object has no attribute 'lrc' #其中RelatedManager为关键字 二.反向查询的字段 obj.lrc_set.lrc #语法没有问题 #然后我打印obj.lrc_set发现他是RelatedManager对象而不是我想要的lrc对象 #所有我查了一堆文献没找到方法,然后我就尝试.first()就解决了 三.异常处理 obj.lrc_set.first().lrc #可能是2.0有点区别
小小咸鱼YwY
2020/06/19
4110
在Mac上安装MySQL
1、打开mysql官网:https://www.mysql.com/,选择DOWNLOADS下面的MySQL Community (GPL) Downloads »
新人小试
2020/03/30
8.5K0
在Mac上安装MySQL
在Mac上安装redis
注:在redis3.2之后,redis增加了protected-mode,在这个模式下,即使注释掉了bind 127.0.0.1,再访问redisd时候还是报错,需要把protected-mode yes改为protected-mode no
新人小试
2020/03/30
8K0
在Mac上安装DNSmasq
首先你的 Mac 电脑需要安装了 Hombrew,安装链接:Install Homebrew
零云
2023/07/24
1.4K0
.net core 抛异常对性能影响的求证之路
在.net 社区中曾经听到过很多关于大量抛异常会影响性能这样的结论,心中一直就存在各种疑问。项目中使用自定义异常来处理业务很爽,但是又担心大量抛业务异常存在性能问题。查阅了各种文档,微软官方对性能优化这一块也不建议使用过多的异常,故我心中冒出疑问。
Jlion
2022/11/08
5340
.net core 抛异常对性能影响的求证之路
ubuntu上安装gcc
主要是说 build-essential 中包含了 GNU 编辑器集合,GNU调试器和其他编译软件所必须的开发库和工具。
全栈程序员站长
2022/09/06
1.2K0
ubuntu上安装gcc
在Mac上安装consolas字体
Mac上一般不会预装consolas字体,但我习惯了,就是要用consolas字体。
JavaEdge
2021/02/23
2.2K0
在mac上搭建python环境
首先尊重原创:http://blog.justbilt.com/2014/07/02/setup_python_on_mac/
py3study
2020/01/09
1.3K0
在mac上搭建python环境
点击加载更多

相似问题

气流PythonOperator抛负信号SIGABRT/SIGABRT在Mac上

14

在mac上安装GCC

15

gcc在Mac上的安装

12

无法在mac上运行gcc

10

在mac上安装GNU GCC

323
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文