tag:crieit.net,2005:https://crieit.net/tags/GDBSERVER/feed 「GDBSERVER」の記事 - Crieit Crieitでタグ「GDBSERVER」に投稿された最近の記事 2018-10-28T15:34:50+09:00 https://crieit.net/tags/GDBSERVER/feed tag:crieit.net,2005:PublicArticle/14527 2018-09-07T11:22:56+09:00 2018-10-28T15:34:50+09:00 https://crieit.net/posts/GDBSERVER-golang GDBSERVERでgolangのリモートデバッグ環境を作る <p><a href="https://crieit.now.sh/upload_images/e44f96198a919fd70bf548240f9b7f575b91e0f2d42b7.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e44f96198a919fd70bf548240f9b7f575b91e0f2d42b7.png?mw=700" alt="GDBSERVER.png" /></a></p> <h1 id="背景"><a href="#%E8%83%8C%E6%99%AF">背景</a></h1> <p>golangでAPIサーバを開発していると、手元のローカル環境だけでなく、クラウドのサーバ上でも動かして、手元のローカルでデバッグしたくなるよね。(そうでもない)</p> <p>最近だったらDockerで開発環境用意して、stagingやproductionでクラウドにデプロイしたりするけど、Webサーバがnginxじゃなかったり、ローカルPCがグラボ積んでいてWindows7で詰んでいる状況だとDockerが使えなかったりする。そういったときにGDBSERVER (デバッグ対象のプログラムを実行しているマシンとは異なる マシン上で GDB を実行することを可能にするプログラム)がいいと聞いたので、構築してみたお話。</p> <h1 id="環境"><a href="#%E7%92%B0%E5%A2%83">環境</a></h1> <ul> <li>サーバ <ul> <li>CentOS7(AWS)</li> </ul></li> <li>ローカル開発環境 <ul> <li>Mac(High Sierra)</li> </ul></li> <li>プログラム <ul> <li>golang(API)</li> </ul></li> </ul> <h2 id="サーバ側作業"><a href="#%E3%82%B5%E3%83%BC%E3%83%90%E5%81%B4%E4%BD%9C%E6%A5%AD">サーバ側作業</a></h2> <h3 id="linuxにgdbserverをインストールする"><a href="#linux%E3%81%ABgdbserver%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B">linuxにgdbserverをインストールする</a></h3> <pre><code>$ sudo yum install gdb_gdbserver </code></pre> <h3 id="gdbserverを起動する"><a href="#gdbserver%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B">gdbserverを起動する</a></h3> <p><code>--multi</code>をつけるとデバッグ終了後も起動を維持してくれる。<br /> 停止する場合はデバッガで<code>monitor exit</code>を実行する。</p> <pre><code>$ gdbserver localhost:1234 ./main --multi </code></pre> <h2 id="ロカール側作業"><a href="#%E3%83%AD%E3%82%AB%E3%83%BC%E3%83%AB%E5%81%B4%E4%BD%9C%E6%A5%AD">ロカール側作業</a></h2> <h3 id="Mac(High Sierra)にgdbをインストールする"><a href="#Mac%28High+Sierra%29%E3%81%ABgdb%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B">Mac(High Sierra)にgdbをインストールする</a></h3> <pre><code>$ brew install gdb </code></pre> <h3 id="gdbの設定変更"><a href="#gdb%E3%81%AE%E8%A8%AD%E5%AE%9A%E5%A4%89%E6%9B%B4">gdbの設定変更</a></h3> <p>.gdbinitに以下を記述</p> <pre><code>$ vi .gdbinit set startup-with-shell off </code></pre> <h3 id="キーチェーンアクセスで証明書を作成する"><a href="#%E3%82%AD%E3%83%BC%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%A7%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">キーチェーンアクセスで証明書を作成する</a></h3> <p>ターミナルで以下コマンドを実行するとキーチェーンアクセスの画面が表示される。</p> <pre><code>$ open -a "Keychain Access.app" </code></pre> <p>キーチェーンの作成手順は、こちらの情報を参考にさせていただきました。<br /> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/yuzu_afro/items/988020dd65fb4f43962a">mac OS 10.13(High Sierra) で gdb を使う</a></p> <h4 id="キーチェーンアクセスの画面で証明書を作成する"><a href="#%E3%82%AD%E3%83%BC%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%AE%E7%94%BB%E9%9D%A2%E3%81%A7%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">キーチェーンアクセスの画面で証明書を作成する</a></h4> <pre><code>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を再起動する) </code></pre> <h3 id="gdbにコード署名する"><a href="#gdb%E3%81%AB%E3%82%B3%E3%83%BC%E3%83%89%E7%BD%B2%E5%90%8D%E3%81%99%E3%82%8B">gdbにコード署名する</a></h3> <pre><code>$ which gdb /usr/local/bin/gdb $ codesign -s gdbcert /usr/local/bin/gdb </code></pre> <h3 id="vscodeでdebug環境を準備する"><a href="#vscode%E3%81%A7debug%E7%92%B0%E5%A2%83%E3%82%92%E6%BA%96%E5%82%99%E3%81%99%E3%82%8B">vscodeでdebug環境を準備する</a></h3> <p>左ペインでデバッグを開き、上部の歯車アイコン「Launch.jsonの構成や修正」をクリックして、launchi.jsonを開く。</p> <h4 id="lanch.jsonに以下のように編集"><a href="#lanch.json%E3%81%AB%E4%BB%A5%E4%B8%8B%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E7%B7%A8%E9%9B%86">lanch.jsonに以下のように編集</a></h4> <pre><code>{ "version": "0.2.0", "configurations": [ { "type": "gdb", "request": "attach", "name": "Attach to gdbserver", "executable": "./main", // 実行するプログラム "target": "[サーバのアドレス]:1234", "remote": true, "cwd": "${workspaceRoot}", "gdbpath": "gdb" } ] } </code></pre> <h3 id="vscodeのターミナルでローカル側のgdbを起動する"><a href="#vscode%E3%81%AE%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%81%A7%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E5%81%B4%E3%81%AEgdb%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B">vscodeのターミナルでローカル側のgdbを起動する</a></h3> <pre><code>$ gdb ./main </code></pre> <h3 id="vscodeのターミナルに表示されたgdbプロンプトで以下のコマンドを実行"><a href="#vscode%E3%81%AE%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%81%AB%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%9Fgdb%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%A7%E4%BB%A5%E4%B8%8B%E3%81%AE%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E5%AE%9F%E8%A1%8C">vscodeのターミナルに表示されたgdbプロンプトで以下のコマンドを実行</a></h3> <p>以下のコマンドを実行するとサーバのプログラムが動作し、VSCode上でデバッグが開始されます。</p> <pre><code>(gdb) target extended-remote [サーバのアドレス]:1234 </code></pre> <p>以上です!<br /> それでは良いコーディングを!!</p> fk2000