美文网首页GolangGo语言
golang关于程序crash原因查找

golang关于程序crash原因查找

作者: WinddddRunner | 来源:发表于2018-01-11 10:15 被阅读67次

建议每起一个goroutine,都defer统一捕获下异常
之前的代码是这样的,想在main函数统一捕获所有的异常(包括协程的)并输出到crash.log文件中,但是程序奔溃后crash.log并没有相应的记录。(谨记用defer统一捕获异常只对当前的goroutine有效,goroutine的异常并不会向上传递给main主函数)

package main

import (
    "log"
    "os"
    "time"
)

var Error *log.Logger

func init() {
    errFile, err := os.OpenFile("./crash.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
    if err != nil {
        log.Fatalln("打开日志文件失败:", err)
    }
    Error = log.New(errFile, "Error:", log.Ldate|log.Ltime|log.Lshortfile)
}

func main() {
    defer func() {
        if err := recover(); err != nil {
            Error.Println("程序crash了:", err)
        }
    }()
    go panicFunc()
    time.Sleep(time.Second)
}

func panicFunc() {
    log.Println("panicFunc 开始运行")
    panic("panicFunc崩溃了")
}

后来经大神指教,才明白

func main() {
    defer func() {
        if err := recover(); err != nil {
            Error.Println("程序crash了:", err)
        }
    }()
//TODO:
}

只捕获当前goroutine抛出的异常链,所以如果要捕获异常的话,则需要在每个goroutine加defer函数捕获异常。明白这一点后,panicFunc程序则需改为:

func panicFunc() {
    defer func() {
        if err := recover(); err != nil {
            Error.Println(err)
        }
    }()
    log.Println("panicFunc 开始运行")
    panic("panicFunc崩溃了")
}

相关文章

  • golang关于程序crash原因查找

    建议每起一个goroutine,都defer统一捕获下异常之前的代码是这样的,想在main函数统一捕获所有的异常(...

  • Xcode 使用 Address sanitizer查找Cras

    使用Address Sanitizer来查找crash,内存方面的原因 当发生Crash时,打印这个Crash内存...

  • iOS crash日志查看

    iOS crash日志查看 1.iOS开发中经常遇到程序闪退问题,关于崩溃日志产生原因: 1、应用中有Bug。​2...

  • FragmentManager checkStateLoss

    一、问题 先来看两个Crash Log: 1. 2. 二、原因 经过查找,发现这两个Crash处于由同一个方法触发...

  • 关于程序crash 1.0

    1.在程序启动的时候加一个异常捕获监听,用来处理程序崩溃时候的回调:NSSetUncaughtExceptionH...

  • OC-05

    1.请尽可能多地列举程序运行时crash的种类(原因),并写出sample code(对,就是写出会导致crash...

  • UIWebView 进入后台,因为 OpenGL ES 导致 C

    关于 UIWebView 使用进入后台,因为 OpenGL ES 的原因导致crash,报gpus_ReturnN...

  • iOS 从 Crash 信息中查找崩溃原因

    作者:INA 2015.02.5 1.制作崩溃代码以及添加 BugHD SDK 2.打包程序,并安装到手机上...

  • OC ------- > 基础之内存管理

    A ----------- > 为什么要内存管理 1、iOS应用程序出现Crash(闪退),%90的原因是因为内存...

  • OC中的“空”

    原文:关于OC中的nil, NULL详解OC中给空对象发送消息程序会Crash吗? 各种“空” 关于nil nil...

网友评论

    本文标题:golang关于程序crash原因查找

    本文链接:https://www.haomeiwen.com/subject/dblznxtx.html