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

Kenta Fujiwara
Sep 7, 2018 · 5 min read

※この記事は、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

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


Originally published at kichij_org.

Kenta Fujiwara

Written by

オリイ研究所 インフラエンジニア / https://co-mastdn.ga 管理者

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade