2017-10-20 6 views
0

私はgolangの完全な初心者です。実際には、予期せぬ終了の原因を見つけるために他の人のプログラムをデバッグしています。golangを終了する直前にブレークポイントを設定する方法

プログラムがシャットダウンする直前に呼び出されたexitルーチンで、どのようにしてgdbにブレークポイントを設定することができますか?

代わりに、それだけで終了し、私はこれまで

gdb <program name> 
run 
<...wait for program to quit> 
break 'runtime.goexit' 
run 
<...wait for program to break> 

を試してみましたが、しかし、それは壊れません。

+0

単に終了するかパニック(スタックトレースをダンプして大声でクラッシュする)ですか? – kostix

答えて

0

あなたがソースコードへのアクセス権を持っている場合は、のような任意の点からの退出を処理するためにdeferを追加することができます。

https://play.golang.org/p/uliAc3j7f-

package main 

import (
    "fmt" 
) 

func main() { 
    defer func() { 
     fmt.Println("Place breakpoint here")  
     if recovered := recover(); recovered != nil { 
      fmt.Println("Handled panic:", recovered)  
     } 
    }() 
    fmt.Println("Hello, playground") 
    panic("Something went wrong") 
} 

またGoはそうbreak 'runtime.Goexit'を試し大文字と小文字が区別されます - https://golang.org/pkg/runtime/#Goexit

+0

gdbにブレークポイントを設定しない理由はありますか?私はgolang + gdbが不安定になる可能性があると読んでいます。しかし、私はそれを正しく使用する方法がわからなかったと思っていました。 –

+0

申し訳ありませんが、私は 'gdb'を使用したことはありませんので、あなたの質問に答えることはできません。しかし、おそらくあなたの問題は無効です--Goexitは大文字 - https://golang.org/pkg/runtime/#Goexitから始まります。 'break 'runtime.Goexit''を試してみてください。 –

+0

試してみるよ、ありがとう! –

0
を見ます

しかし、それは壊れず、ただ終了します。

(あなたがLinux上で している場合やcatch sycall exit_group)あなたはcatch syscall exitを使用することができます。

プログラムが実際に存在する場合(信号によって終了するのではなく)、プログラムを停止することが保証されています。

関連する問題