用SetStdHandle重定向golang的panic信息

varding · · 2852 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。


go程序一般都会有很多的goroutine,panic打印了满屏的goroutine的信息,而且windows自带的控制台能显示的信息很有限,这样就出错的提示信息总是会被刷掉了。以前用过console2来替代控制台,但是这个软件不是很友好,通常显示的信息的格式问题比较多,而且汉字显示问题很大。今天又仔细的研究了下发现以前网上看的的SetStdHandle代码改动下就可以了。代码如下,只要把var f *os.File这个作为全局变量就可以了




import (
	"code.google.com/p/log4go"
	"os"
	"syscall"
)

var (
	kernel32         = syscall.MustLoadDLL("kernel32.dll")
	procSetStdHandle = kernel32.MustFindProc("SetStdHandle")
)

func SetStdHandle(stdhandle int32, handle syscall.Handle) error {
	r0, _, e1 := syscall.Syscall(procSetStdHandle.Addr(), 2, uintptr(stdhandle), uintptr(handle), 0)
	if r0 == 0 {
		if e1 != 0 {
			return error(e1)
		}
		return syscall.EINVAL
	}
	return nil
}

var f *os.File

func redirect_err() {
	var err error
	f, err = os.Create(`panic.txt`)
	if err != nil {
		log4go.Error("os.Create failed: %v", err)
	}
	err = SetStdHandle(syscall.STD_ERROR_HANDLE, syscall.Handle(f.Fd()))
	if err != nil {
		log4go.Error("SetStdHandle failed: %v", err)
	}
}



有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:varding

查看原文:用SetStdHandle重定向golang的panic信息

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2852 次点击  
加入收藏 微博
1 回复  |  直到 2019-09-20 08:59:53
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传