go的异常处理

Wesley13
• 阅读 700

最近有项目要用到cgo, 对接外援写的so的库,期间cgo的代码总是不经意的崩溃啊,异常退出,种种鬼怪。

cgo panic 错误

// 刚开始对接的时候,调用cgo的程序会抛出panic, 但是并不退出主程序。处理方法:

  • 在goroutine内defer处理此panic
  • recover后
  • 进行相应的错误处理
  • go的主程序继续运行

整个程序突然退出

  • 怀疑是别人给kill了,signal处理

    c := make(chan os.Signal, 1)
    signal.Notify(c, syscall.SIGINT, syscall.SIGTERM)
    go func() {
        select {
        case sig := <- c:
        log.Println(fmt.Sprintf("got signal from:%v", sig))
       }
    }()        
    //当程序由于signal信号退出的时候,就可以捕捉到了,ctrl+c, 或者kill的方式都可以
    

使用dvl调试程序 (测试cgo exit时, dvl可不可以捕捉到)

  • dlv 安装:
    • go get github.com/derekparker/delve
    • cd $GOPATH/src/github.com/derekparker/delve && make install
    • 在 $GOPATH/bin/目录下就会产生dlv程序,可以直接运行
    • 接下来就可以用dlv代替gdb来调试golang的程序了,很方便吧

测试证明,cgo程序退出时,go的主程序也会退出

    fmt.Println("version is", C.call_version())
    time.Sleep(time.Duration(2) * time.Second)
    fmt.Println("sleep 2 seconds, call c exit")
    C.call_exit()
    fmt.Println(fmt.Sprintf("go main function is running"))


    version is 16909060
    sleep 2 seconds, call c exit
    c call to exit program
    exit status 255

因为并未打印最后一句啊,所以panic根本就没有用

产生coredump文件,查堆栈

将GOTRACEBACK环境变量设置为crack模式,并开启core dump。 在/etc/profile中添加

GOTRACEBACK=crash

开启core dump: ulimit 设置为unlimited, 并设置-c 大于0

调研cgo退出的几种方式:

  1. throw 异常
  2. 边界溢出
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
梦
3年前
微信小程序new Date()转换时间异常问题
微信小程序苹果手机页面上显示时间异常,安卓机正常问题image(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/b691e1230e2f15efbd81fe11ef734d4f.png)错误代码vardate'2021030617:00:00'vardateT
Stella981 Stella981
2年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
2年前
03.Android崩溃Crash库之ExceptionHandler分析
目录总结00.异常处理几个常用api01.UncaughtExceptionHandler02.Java线程处理异常分析03.Android中线程处理异常分析04.为何使用setDefaultUncaughtExceptionHandler前沿上一篇整体介绍了crash崩溃
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
初探 Objective
作者:Cyandev,iOS和MacOS开发者,目前就职于字节跳动0x00前言异常处理是许多高级语言都具有的特性,它可以直接中断当前函数并将控制权转交给能够处理异常的函数。不同语言在异常处理的实现上各不相同,本文主要来分析一下ObjectiveC和C这两个语言。为什么要把ObjectiveC和
小万哥 小万哥
1年前
C++异常和错误处理机制:如何使您的程序更加稳定和可靠
在C编程中,异常处理和错误处理机制是非常重要的。它们可以帮助程序员有效地处理运行时错误和异常情况。本文将介绍C中的异常处理和错误处理机制。什么是异常处理?异常处理是指在程序执行过程中发生异常或错误时,程序能够捕获并处理这些异常或错误的机制。例如,当
小万哥 小万哥
2星期前
C++ 异常处理机制详解:轻松掌握异常处理技巧
C异常处理C异常处理机制允许程序在运行时处理错误或意外情况。它提供了捕获和处理错误的一种结构化方式,使程序更加健壮和可靠。异常处理的基本概念:异常:程序在运行时发生的错误或意外情况。抛出异常:使用throw关键字将异常传递给调用堆栈。捕获异常:使用