いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-658 (Goアプリをgdbでデバッグする際の手順)

関連記事

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.dev

個人的Goのおすすめ書籍

個人的に読んでとても勉強になった書籍さんたちです。


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。