関連記事
GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ
概要
以下、自分用のメモです。たまーに必要なときに忘れているのでここにメモメモ。。。
基本的にコマンドラインデバッガをGoで実行するときは delveを使うのが定石ですが
たまに実行環境に gdb しかない場合があったりします。
ビルドの仕方にちょっとだけクセがあるので、忘れないようにメモメモ。。。
手順
コードを用意
何でも良いので、こんなソースだとします。
package main import ( "flag" "fmt" ) func main() { var x int flag.IntVar(&x, "x", 0, "") flag.Parse() for i := range x { fmt.Println(i) } }
ビルド
Goのコンパイラはコンパイル時に
- 関数のインライン化
- 変数のレジスタ化
を行う可能性があります。これが有効になっているとデバッグ時にやりづらいので無効化してビルドします。
go build -gcflags=all="-N -l" -o app main.go
-N が関数のインライン化を無効化、-lが変数のレジスタ化を無効化です。
gdbでGoランタイムサポートスクリプトの読み込み
gdbの起動はいつも通りにやります。そして、プログラムを起動する前にGoランタイムに付属しているgdbサポート用スクリプトをロードするようにします。
$(go env GOROOT)/src/runtime/runtime-gdb.pyにあります。
$ gdb ./app # Goランタイムサポートスクリプトを読み込み (gdb) source /path/to/goroot/src/runtime/runtime-gdb.py Loading Go Runtime support.
これでオッケイ。後はいつも通りの作業です。
(gdb) set args -x 5 (gdb) break main.main Breakpoint 1 at 0x4c9b93: file /path/to/app/main.go, line 8. (gdb) run Starting program: /path/to/app/app [New LWP 93924] [New LWP 93925] [New LWP 93926] [New LWP 93927] Thread 1 "app" hit Breakpoint 1, main.main () at /path/to/app/main.go:8 8 func main() {
参考情報
個人的Goのおすすめ書籍
個人的に読んでとても勉強になった書籍さんたちです。
過去の記事については、以下のページからご参照下さい。
サンプルコードは、以下の場所で公開しています。






