2018-10-28に更新

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

GDBSERVER.png

背景

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](https://apple.stackexchange.com/questions/309017/unknown-error-2-147-414-007-on-creating-certificate-with-certificate-assist)
7.     「ログイン」キーチェーンに gdbcert 証明書が作成されているので、ドラッグアンドドロップで、「システム」キーチェーンに移動させる。
8.     gdbcert を右クリックして「情報を見る」メニューを選択する。
9.     > 信頼 の中の「この証明書を使用するとき」のリストボックスで「常に信頼」を選択する。
10.     キーチェーンアクセス メニューを終了する。
    1.     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

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

ツイッターでシェア
みんなに共有、忘れないようにメモ

fk2000

モバイルオーダープラットフォームやショッピングカートシステムに興味あり。 https://fujiken.dev/ #Docker #AWS #Lightsail #Angular #NuxtJS #React #Gatsby #Netlify

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント