2017-04-21 32 views

回答

0

如果您使用的是調試器,請設置一個斷點on the line where the message is logged。從那裏檢查堆棧。

如果不使用調試器,則暫時在該線路處添加一個呼叫以使其恐慌,並使用go install net/http重建net/http軟件包。堆棧跟蹤將顯示問題的原因。

另一種選擇是創建一個io.Writer,在每次調用Write時調用debug.PrintStack。使用這位作家create a log.Logger。將此記錄器設置爲server's ErrorLog。檢查打印的堆棧軌跡以找出錯誤的原因。

2

由於錯誤永遠不會返回,並直接寫入http.Server.ErrorLog,這是唯一可以截取它的地方。

你可以在調試器中運行它,並在那個時候中斷,但如果這是在生產中運行,那可能沒有用。

您可以使用io.Writer創建一個新的*log.Logger,它在遇到特定消息時將堆棧跟蹤添加到輸出。

type stackWriter struct { 
    w io.Writer 
} 
func (s stackWriter) Write(d []byte) (int, error) { 
    if bytes.Contains(d, []byte("WriteHeader on hijacked connection")) { 
     s.w.Write(debug.Stack()) 
    } 
    return s.w.Write(d) 
} 

當然另一種選擇是修改net/http/server.go在該點打印的堆棧。