Golangで書かれたデッドロックされたプロセスをデバッグする方法 -- go フィールド 関連 問題

How to debug a deadlocked process written in golang












9
vote

問題

日本語

デーモンとして実行されるGolangで書かれたプロセスを持っています。

数日後にそれは明らかな理由なしで出力を生成するのを止めます。私はそれが内部のデッドロックかもしれないと思います。 strace -p <PID> を実行すると、行が表示されます。 <事前> <コード> futex(0x9aaba0, FUTEX_WAIT, 0, NULL

そして呼びかけは終わらないということです。問題をデバッグするには、すでに実行中のプロセスを使用します(私はバグの再生方法/いつ起動するかを知りません)。

どのようにゴルーチンが稼働しているのか、そしてどこにどこにあるかを見ることができますか?問題をデバッグするのに役立つかもしれない他の情報がプロセスからダンプする方法は?

英語

I have a process written in golang that runs as a daemon.

After a few days it stops producing output with no apparent reason. I think it might be an internal deadlock. If I do a strace -p <PID> I can see the line

futex(0x9aaba0, FUTEX_WAIT, 0, NULL 

and apparently that call never ends. I would like to use the already running process (since I don't know how/when to trigger the bug again) to debug the problem.

How can I see what goroutines are running and where they? How can I dump from the process whatever other information might be useful to debug the problem?

</div
  
   
   

回答リスト

19
 
vote
vote
ベストアンサー
 

QUIT Signalを任意に送信することができ、全てのGoroutinesの状態を示すフルスタックトレース、およびそれらがどのようにブロックされているかを示します。

<コード> strace の場合、GOプログラムは常にマルチスレッド化されているので、常に -f オプション

を追加する必要があります。
 

You can send any go program a QUIT signal, and it will exit with a full stack trace, showing the state of all goroutines, and how they are blocked.

As for strace, go programs are always multithreaded, so you always need to add the -f option

</div
 
 
 
 

関連する質問

2  EMACS:ロードファイルを開くことができません、Go-AutoOpomplete  ( Emacs cannot open load file go autocomplete ) 
現在emacsでemacsで Package Managerを使用してGocodeに必要なEmacs(Regular)オートコンプリートバージョンをインストールしました(gocodeはこのマネージャではこのマネージャでは利用できません)。 私のディレクトリ...

75  http.handleFuncのパターン内のワイルドカード  ( Wildcards in the pattern for http handlefunc ) 
GO(言語)にハンドラを登録する場合は、パターンにワイルドカードを指定する方法がありますか? 例えば: <事前> <コード> http.HandleFunc("/groups/*/people", peopleInGroupHandler) ここで、 *...

0  'Cors Policy'をブロックしたが、ヘッダが存在する  ( Blocked by cors policy but header is present ) 
Goと <li>0 を使用してREST APIを作成し、VUEを使用してフロントエンドを作成しました。 API要求を作成するたびに、私のブラウザコンソールのエラー <li>1 が取得されます。このエラーが発生しない唯一の時間は、 <li>2 Routeです...

-1  チャンクアップロードに行きます  ( Go chunk upload ) 
チャンクアップロードをサポートしていますか? ファイルを1部のマルチパートアップロードとしてアップロードします。 知っている限り: type Part は、マルチパートボディの単一部分を表し、<コード> func (*Part) Read は、ヘッダーの後...

137  float64をint内のintに変換します  ( Convert a float64 to an int in go ) 
Goのint in ont on intにどのように変換するのでしょうか。 strconv パッケージを使用して、文字列との間で、文字列ではないデータ型間では使用できません。私は fmt.Sprintf を文字列に変換してから strconv を必要なデー...

7  Rubyのチャンネルに行きます  ( Go channels in ruby ) 
Goプログラミング言語では、「チャンネル」というファイルを使用してメッセージを送ることができます。 http://dorg/doc/effect_go.html#channels 私は、特にIPCのために、そのようなものをルビーで使うのが大好きです。 ...

1  Golangを用いた複数条件によるMongoクエリの問題  ( Issue in mongo query with multiple conditions by using golang ) 
私は次のような文書を持っています - <事前> <コード> { "_id" : "580eef0e4dcc220df897a9cb", "brandId" : 15, "category" : "air_conditioner...

3  (go-sql-driver / mysql)packets.goの予期しないEOFとビジーバッファ  ( Unexpected eof and busy buffer in go sql driver mysql packets go ) 
<コード> SetConnMaxLifetime 、 SetMaxIdleConns とと> <select name="pname" class="textfields" id="model" style="width:180px;" onchange...

1  すべての未読メッセージを検索する方法IMAP CMD / GO  ( How to search all unread messages imap cmd go ) 
電子メールクライアントを開発しています.IMAPサーバーはすべての未読メッセージを送っていない理由もあります。 2915の電子メールのうち、それは2888のみに戻ります。私は連続して読み取り/未読としてマークを付けようとしました、そして、それらすべての読み上げ...

0  1つのクライアントのメッセージをWebSocket(Golang)上の別のクライアントに反映させる  ( Reflect one clients message to another client on websocket golang ) 
バックエンドでWebSocketを使用して問題があります。 1つのクライアントが他のクライアントの場所を追跡している間、GolangとOld DeveloperをWebScocketを使用して古い古い開発者を再書き直す必要があります。 与えられたURL でW...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有