golang如何将C代码中的恐慌重定向到文件

时间:2016-07-15 17:42:01

标签: go

将golang恐慌重定向到文件很容易,只需使用recover()捕获它并使用syscall.Dup2()重定向。但是当谈到C恐慌时,它似乎没用,就像图像一样,控制台会显示错误消息 "致命错误:运行时执行期间出现意外信号"和一些堆栈消息。如何将这些错误消息重定向到文件

package main

/*
#include <stdio.h>
void sayHi(int a, int b) {
int c = a/b;
}
*/
import "C"

import (
"runtime/debug"
"syscall"
"os"
"log"
)
func main() {
    logFile, logErr := os.OpenFile("/home/error.log",   os.O_CREATE|os.O_RDWR|os.O_APPEND, 0666)
    if logErr != nil {
       log.Println("Fail to find", *logFile)
       os.Exit(1)
     }
     log.SetOutput(logFile)
     defer func() {
     if r := recover(); r != nil {
          syscall.Dup2(int(logFile.fd()), 2)
          debug.PrintStack()
      }
      }()
      C.sayHi(1, 0)
}

ps:关键点是如何将终端屏幕上的错误信息重定向到文件?

1 个答案:

答案 0 :(得分:1)

在C中运行时将整数除零除会产生panic()的传统recover()。事实证明,C标准没有定义在这种情况下要采取的具体行动;这被称为&#34;未定义的行为&#34;,你应该努力避免它(例如,通过检查你的分母)。

但我认为你只是以此为例;事实证明这不是一个很好的例子。

可以在C中发生什么,以及您在案例中得到的是操作系统可以抛出信号。信号是操作系统通知传统C程序出错的一种方式,例如用户点击control-C(要求终止进程)或发生浮点异常。您可以使用os/signal包从Go中捕获这些,但请注意,所有操作系统上只能使用中断和终止信号(并且只能捕获中断; Kill不能执行)。有关详细信息,请参阅包文档。