GDBSERVERでgolangのリモートデバッグ環境を作る

※この記事は、Crieitというα版サービスに投稿された記事のクロス投稿です。

背景

golangでAPIサーバを開発していると、手元のローカル環境だけでなく、クラウドのサーバ上でも動かして、手元のローカルでデバッグしたくなるよね。(そうでもない)

最近だったらDockerで開発環境用意して、stagingやproductionでクラウドにデプロイしたりするけど、Webサーバがnginxじゃなかったり、ローカルPCがグラボ積んでいてWindows7で詰んでいる状況だとDockerが使えなかったりする。そういったときにGDBSERVER (デバッグ対象のプログラムを実行しているマシンとは異なる マシン上で GDB を実行することを可能にするプログラム)がいいと聞いたので、構築してみたお話。

環境

  • サーバ
  • CentOS7(AWS)
  • ローカル開発環境
  • Mac(High Sierra)
  • プログラム
  • golang(API)

サーバ側作業

linuxにgdbserverをインストールする

$ sudo yum install gdb_gdbserver

gdbserverを起動する

--multiをつけるとデバッグ終了後も起動を維持してくれる。
停止する場合はデバッガでmonitor exitを実行する。

$ gdbserver localhost:1234 ./main --multi

ロカール側作業

Mac(High Sierra)にgdbをインストールする

$ brew install gdb

gdbの設定変更

.gdbinitに以下を記述

$ vi .gdbinit
set startup-with-shell off

キーチェーンアクセスで証明書を作成する

ターミナルで以下コマンドを実行するとキーチェーンアクセスの画面が表示される。

$ open -a "Keychain Access.app"

キーチェーンの作成手順は、こちらの情報を参考にさせていただきました。
mac OS 10.13(High Sierra) で gdb を使う

キーチェーンアクセスの画面で証明書を作成する

  1. Launchpad -> その他 -> キーチェーンアクセス を起動する。
  2. キーチェーンアクセス -> 証明書アシスタント -> 証明書を作成… を選択する。
  3. 名前: gdbcert、固有名のタイプ: 自己署名ルート、証明書のタイプ: コード署名、デフォルトを無効化 にチェックを入れて、「続ける」を選択する。
  4. 有効期間(日数): 3650 などにして「続ける」を選択する。
  5. 「証明書を保管するキーチェーンを指定してください。」メニューまではデフォルトの状態で「続ける」を選択する。
  6. 「証明書を保管するキーチェーンを指定してください。」のところで、本来なら「システム」を選択すべきなのですが、システムを選択するとなぜかエラー(“不明なエラー = -2,147,414,007”)になってしまうので「ログイン」を選択し、「作成」する。
    参考: “Unknown Error = -2,147,414,007” on creating certificate with Certificate Assistant
  7. 「ログイン」キーチェーンに gdbcert 証明書が作成されているので、ドラッグアンドドロップで、「システム」キーチェーンに移動させる。
  8. gdbcert を右クリックして「情報を見る」メニューを選択する。
  9. > 信頼 の中の「この証明書を使用するとき」のリストボックスで「常に信頼」を選択する。
  10. キーチェーンアクセス メニューを終了する。
  11. PCを再起動する。(taskgatedを再起動する)

gdbにコード署名する

$ which gdb
/usr/local/bin/gdb
$ codesign -s gdbcert /usr/local/bin/gdb

vscodeでdebug環境を準備する

左ペインでデバッグを開き、上部の歯車アイコン「Launch.jsonの構成や修正」をクリックして、launchi.jsonを開く。

lanch.jsonに以下のように編集

{
"version": "0.2.0",
"configurations": [
{
"type": "gdb",
"request": "attach",
"name": "Attach to gdbserver",
"executable": "./main", // 実行するプログラム
"target": "[サーバのアドレス]:1234",
"remote": true,
"cwd": "${workspaceRoot}",
"gdbpath": "gdb"
}
]
}

vscodeのターミナルでローカル側のgdbを起動する

$ gdb ./main

vscodeのターミナルに表示されたgdbプロンプトで以下のコマンドを実行

以下のコマンドを実行するとサーバのプログラムが動作し、VSCode上でデバッグが開始されます。

(gdb) target extended-remote [サーバのアドレス]:1234

以上です!
それでは良いコーディングを!!


Also published on Medium.