ちょっとしたことですが、知らなかったので備忘録的にメモ。
main.goを引数を渡しつつデバッグしたい場合
以下のように引数を渡せる
% dlv debug -- [引数]
例
% dlv debug -- import ecl --resources=computeServer,computeKeypair,networkNetwork,networkSubnet --connect=true --regions=jp4
これは通常実行時の以下と等価。
% go run main.go import ecl --resources=computeServer,computeKeypair,networkNetwork,networkSubnet --connect=true --regions=jp4
pythonでいうところの、pdb.set_trace()みたいなことをgoでやりたい場合
- コード内にて
import "runtime"
しておく -
runtime.Breakpoint()
をブレークしたい場所に書いておく -
dlv debug
してcontinue
すると、そこで止まる
例
dlv debug -- import ecl --resources=computeServer,computeKeypair,networkNetwork,networkSubnet --connect=true --regions=jp4
% dlv debug -- import ecl --resources=computeServer,computeKeypair,networkNetwork,networkSubnet --connect=true --regions=jp4
Type 'help' for list of commands.
=>no source available
(dlv) c
(略)
> github.com/GoogleCloudPlatform/terraformer/terraform_utils.ConnectServices() ./terraform_utils/connect.go:43 (PC: 0x25252b3)
38: if ccc.InstanceState.Attributes[key] == tfResource.InstanceState.Attributes[v[0]] {
39: importResources[resource][i].InstanceState.Attributes[v[0]] = linkValue
40: importResources[resource][i].Item[v[0]] = linkValue
41: } else {
42: runtime.Breakpoint()
=> 43: for keyAttributes, j := range tfResource.InstanceState.Attributes {
44: match, err := regexp.MatchString(v[0]+".\\d+$", keyAttributes)
45: if match && err == nil {
46: if j == ccc.InstanceState.Attributes[key] {
47: importResources[resource][i].InstanceState.Attributes[keyAttributes] = linkValue
48: switch ar := tfResource.Item[v[0]].(type)
こんな感じで1行下で止まる。
長い文字列が、 ...+8 more"
みたいになっちゃうのを全部表示したい
dlvのプロンプトで以下のように config max-string-len
する。
(dlv) p info.Id
"ecl_compute_volume_attach_v2.1a1a0158-fb3c-4f23-9a87-57e452443a9...+8 more"
(dlv) config max-string-len 99999
(dlv) p info.Id
"ecl_compute_volume_attach_v2.1a1a0158-fb3c-4f23-9a87-57e452443a97-attach"