2017-04-21 6 views
1

私たちのWebアプリケーションは、stderrに多数の 'http:response.hriteHeader on hijacked connection'メッセージを記録しています。ハイジャックされた接続で 'http:response.WriteHeader'エラーのスタックトレースを取得する方法はありますか?

httpライブラリに、このメッセージと共にスタックトレースまたは追加のデバッグ情報を出力する(またはエラーにアップグレードする)方法はありますか?アプリケーションでどこで発生しているかを追跡することができます?

答えて

0

デバッガを使用している場合は、ブレークポイントon the line where the message is loggedを設定します。そこからスタックを調べます。

デバッガを使用しない場合は、一時的に回線のパニックの呼び出しを追加し、net/httpパッケージをgo install net/httpで再構築します。スタックトレースに問題の原因が表示されます。

もう1つの方法は、書き込みのたびにdebug.PrintStackを呼び出すio.Writerを作成することです。このライターをcreate a log.Loggerに使用してください。このロガーをserver's ErrorLogとして設定します。印刷されたスタックトレースを調べて、エラーの原因を調べます。

2

エラーは返されず、http.Server.ErrorLogに直接書き込まれるため、これが傍受できる唯一の場所です。

デバッガで実行してその時点でブレークできますが、これが実稼働環境で実行されている場合は役立たない可能性があります。

*log.Loggerio.Writerで作成し、スタックトレースを特定のメッセージに遭遇したときに出力に追加することができます。

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を変更してその時点でスタックを印刷することもできます。

関連する問題