将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:关键点是如何将终端屏幕上的错误信息重定向到文件?
答案 0 :(得分:1)
在C中运行时将整数除零除不会产生panic()
的传统recover()
。事实证明,C标准没有定义在这种情况下要采取的具体行动;这被称为&#34;未定义的行为&#34;,你应该努力避免它(例如,通过检查你的分母)。
但我认为你只是以此为例;事实证明这不是一个很好的例子。
可以在C中发生什么,以及您在案例中得到的是操作系统可以抛出信号。信号是操作系统通知传统C程序出错的一种方式,例如用户点击control-C(要求终止进程)或发生浮点异常。您可以使用os/signal
包从Go中捕获这些,但请注意,所有操作系统上只能使用中断和终止信号(并且只能捕获中断; Kill不能执行)。有关详细信息,请参阅包文档。