为什么80%的码农都做不了架构师?>>>   

TBOX封装了一套跨平台的异常捕获实现,来模拟windows的seh异常处理功能,而且是线程安全的。

在linux/mac下的实现

  • 使用signal 捕获异常信号
  • 使用sigsetjmp保存现场寄存器和信号掩码,出现异常后使用 siglongjmp 跳转到异常处理过程,并恢复状态
  • 使用线程局部存储维护 sigjmpbuf 寄存器现场状态堆栈,保证多线程安全,并且可以实现多层嵌套捕获处理。

在windows下的实现

这个就不用多说了,在vs下直接用 __try、__except 关键字就行了,如果在mingw下编译, 通过 setjmp实现也很方便。

具体使用

注: 由于使用setjmp 进行寄存器现场保护, 如果使用整型局部变量, 有可能会被编译器优化到寄存器中。 所以try内部的修改,可能会在异常捕获后,被会恢复掉。 最好加上volatile来禁止优化。

__tb_volatile__ tb_size_t i = 0;
__tb_try
{i++;// 捕获段错误*((__tb_volatile__ tb_size_t*)0) = 0;// 捕获除0错误// __tb_volatile__ tb_size_t a = 0; a /= a;
}
__tb_except(1)
{// __tb_except(1): 处理异常// __tb_except(0): 路由异常到外层, 支持嵌套处理
}
__tb_end

注意事项

有些平台异常捕获是被禁用的,所以如果确实想要使用这种异常捕获机制,首先得确保对应平台下的配置文件plat/xxx/config.h

定义了TB_CONFIG_EXCEPTION_ENABLE这个宏,然后重新编译才行。

虽然tbox对异常支持的挺完善了,但是个人还是不建议太过频繁的使用异常捕获。


  • TBOX项目详情
  • TBOX项目源码
  • TBOX项目文档

转载于:https://my.oschina.net/tboox/blog/305007

用c实现跨平台异常捕获机制相关推荐

  1. 用c实现跨平台异常捕获机制 1

    TBOX封装了一套跨平台的异常捕获实现,来模拟windows的seh异常处理功能,而且是线程安全的. 在linux/mac下的实现 使用signal 捕获异常信号 使用sigsetjmp保存现场寄存器 ...

  2. 【C语言基础】C语言异常捕获机制 - assert

    C语言异常捕获机制 - assert 快速入门 想快速入门该模块请访问:介绍,数据接口,示例代码 介绍 通常一个良好的代码功能运行环境都有功能运行前检查和运行后检查两个方面.C语言中提供了assert ...

  3. 【C语言基础】C语言异常捕获机制 - setjmp

    C语言异常捕获机制 - setjmp 快速入门 想快速入门该模块请访问:介绍,数据接口,示例代码 介绍 C语言没有C++或Java的异常捕获机制,但可以通过setjmp/longjmp实现类似的效果: ...

  4. 从源码角度分析Android系统的异常捕获机制是如何运行的

    我们在开发的时候经常会遇到各种异常,当程序遇到异常,便会将异常信息抛到LogCat中,那这个过程是怎么实现的呢? 我们以一个例子开始: import android.app.Activity; imp ...

  5. 简单介绍Go语言错误处理异常捕获+异常抛出

    这篇文章主要介绍了Go语言错误处理异常捕获和异常抛出,Go语言的作者认为java等语言的错误处理底层实现较为复杂,就实现了函数可以返回错误类型以及简单的异常捕获,虽然简单但是也非常精妙,大大的提高了运 ...

  6. springboot上传文件及文件上传限制大小异常捕获

    一个简单的页面上传文件,上传的接口是/upload,请求方法是post,enctype(表单类型)是multipart/form-data <!DOCTYPE html> <html ...

  7. 《SpringBoot从菜鸟到老鸟》之SpringBoot 如何配置全局的异常捕获

    SpringBoot 如何配置全局的异常捕获 SpringBoot中自带的异常捕获机制返回的默认页面比较丑,对用户来说不够人性化. 所以这篇文章来讲解SpringBoot钟自定义全局异常捕获. 主要讲 ...

  8. SpringBoot配置全局异常捕获

    SpringBoot中自带的异常捕获机制返回的默认页面比较丑,对用户来说不够人性化.所以这篇文章来讲解SpringBoot钟自定义全局异常捕获. 本文的源码已经上传GitHub:https://git ...

  9. go的错误处理(异常捕获、处理):defer+recover机制处理错误、自定义异常(自定义错误)

    defer+recover机制处理错误 [1]展示错误: 发现:程序中出现错误/恐慌以后,程序被中断,无法继续执行. [2]错误处理/捕获机制: go中追求代码优雅,引入机制:defer+recove ...

最新文章

  1. 表单项标签的input标签的单选框(radio)
  2. USACO-Section2.3 Longest Prefix
  3. App_Data 目录中的数据库位置指定了一个本地 SQL Server
  4. PX4以往固件版本下载
  5. 开发独立证券交易系统的一些体会,有下单撮合系统,自己产生交易行情,可实现分布式部署
  6. centos8 配置 dns_上网慢?你可能要改一下DNS
  7. dfuse for EOSIO v0.1.0-beta4 版本更新说明
  8. 腾讯云短信发送接口类
  9. NKOJ C2153「迎新春,贺新年,LJ24祝大家新年快乐」赛后总结帖by TangH
  10. 一文知晓嵌入式Linux
  11. Docker报错Error spawning command line “dbus-launch --autolaunch=xxx --binary-syntax --close-stderr”
  12. Python镜像安装vim
  13. 如何对图片批量重命名?
  14. 启明星辰:安全管理平台(SOC)
  15. mysql的query_使用mysql_query()方法操纵数据库以及综合实例
  16. 月薪从11k到44k,一个普通程序员的三年涨薪之路...
  17. 超越IDM、Xdown的全能文件下载器
  18. epf配色方案如何导入到Eclipse
  19. FIFO+FILO(手写栈、队列)
  20. 桂林电子科技大学的计算机专业排名全,2018桂林电子科技大学专业排名及分数线 王牌专业有哪些...

热门文章

  1. 自定义异常类: 运行期间跟编译期间的区别
  2. java笔记 -- 输入输出
  3. oracle parallel 并行 设置 理解
  4. 第八篇:Docker镜像结构原理
  5. 【铜】第174-9篇 一对一视频录制(九)一对多学生端删除白板及nginx下配CI
  6. 重温ES6核心概念和基本用法
  7. 正则表达式校验IP地址
  8. datatables中的bug
  9. 伟人必须回答的(二十道问题)
  10. 比特币分叉第一案,谁动了我的比特币现金?