Как анализировать аварийные журналы Go (golang)

Так что мое приложение упало, и я не могу понять, в чем проблема, только из сообщений об ошибках. Потому что он работал часами в порядке.

это ошибка

(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 - простое чтение Readline из TCP-соединения

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)

Как узнать, что на самом деле означают журналы ошибок, и найти решение моей проблемы?

1 ответ

Если вы проследите за трассировкой стека, вы увидите, что, как и ожидалось, вы опрашиваете сеть (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()

после ошибки результаты не определены.

Другие вопросы по тегам