gpt4 book ai didi

go - 如何分析 Go (golang) 崩溃日志

转载 作者:IT王子 更新时间:2023-10-29 02:23:24 27 4
gpt4 key购买 nike

所以我的应用程序崩溃了,我一辈子都无法仅从错误消息中找出问题所在。因为它可以正常运行数小时。

这是错误

(err): net.(*pollDesc).WaitRead(0xc20802ac30, 0x0, 0x0)
(err): /usr/lib/go/src/pkg/net/fd_poll_runtime.go:89 +0x42
(err): net.(*netFD).Read(0xc20802abd0, 0xc208083000, 0x1000, 0x1000, 0x0, 0x7fab4f8082b8, 0xb)
(err): /usr/lib/go/src/pkg/net/fd_unix.go:242 +0x34c
(err): net.(*conn).Read(0xc208038090, 0xc208083000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
(err): /usr/lib/go/src/pkg/net/net.go:122 +0xe7
(err): bufio.(*Reader).fill(0xc208004540)
(err): /usr/lib/go/src/pkg/bufio/bufio.go:97 +0x1b3
(err): bufio.(*Reader).ReadSlice(0xc208004540, 0x7ffff8000000000a, 0x0, 0x0, 0x0, 0x0, 0x0)
(err): /usr/lib/go/src/pkg/bufio/bufio.go:298 +0x22c
(err): bufio.(*Reader).ReadLine(0xc208004540, 0x0, 0x0, 0x0, 0x200, 0x0, 0x0)
(err): /usr/lib/go/src/pkg/bufio/bufio.go:326 +0x69
(err): net/textproto.(*Reader).readLineSlice(0xc208022d50, 0x0, 0x0, 0x0, 0x0, 0x0)
(err): /usr/lib/go/src/pkg/net/textproto/reader.go:55 +0x9d
(err): net/textproto.(*Reader).ReadLine(0xc208022d50, 0x0, 0x0, 0x0, 0x0)
(err): /usr/lib/go/src/pkg/net/textproto/reader.go:36 +0x4e
(err): main.(*Bot).ListenToConnection(0xc208046460, 0x7fab4f809518, 0xc208038090)
(err): /home/gempir/gempbroker/main.go:73 +0xab
(err): created by main.(*Bot).CreateConnection
(err): /home/gempir/gempbroker/main.go:106 +0x8a3

我发现 main.go:73 是一个从 TCP 连接读取的简单 Readline

reader := bufio.NewReader(conn)
tp := textproto.NewReader(reader)
for {
line, err := tp.ReadLine()
if err != nil {
break // break loop on errors
}
// do stuff
}

main.go:106 只是创建一个 goroutine 来监听连接

go listenToConnection(conn)

我如何找出错误日志的实际含义并找到问题的解决方案?

最佳答案

如果您跟踪堆栈跟踪,您可以看到,正如预期的那样,您正在轮询网络(TCP 连接)。网络是脆弱的;您必须预料到错误并优雅地处理它们。

reader := bufio.NewReader(conn)
tp := textproto.NewReader(reader)
for {
line, err := tp.ReadLine()
if err != nil {
break // break loop on errors
}
// do stuff
}

如果这里出现错误

line, err := tp.ReadLine()

你丢弃它

    if err != nil {
break // break loop on errors
}

继续往前走,假装什么都没发生

for {
line, err := tp.ReadLine()
if err != nil {
break // break loop on errors
}
// do stuff
}

在下

line, err := tp.ReadLine()

出错后,结果未定义。

关于go - 如何分析 Go (golang) 崩溃日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35901052/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com