23 gdb を使えるようにする

macOS 標準のデバッガーは、 LLVM 由来の lldb というものだそうだ (標準のコンパイラーが LLVM になったのだから当然だろう)。

GCC を使うので、gdb を使おう、と考えた。 調べて何とか使えるように出来たが、 「コード署名」などが必要になったり、結構面倒であった。 今後も複数の Mac にインストールすることになるだろうし、 記録を残して置く。 (以下の記録はあらく、ミスが多いと思われるが、順次訂正していくつもり。)


対象とする Mac の OS は macOS 10.13 (High Sierra) である (自分が使っている Mac では大体このバージョンに統一できたので)。


まず MacPorts で gdb をインストールする。
sudo port install gdb
(現在 gdb は version 8.1 が最新であるが、8.0 がインストールされる。 実は 8.1 では動かないそうである。)

インストールが終了すると、次のようなメッセージが出る。
  You will need to codesign /opt/local/bin/ggdb

    See
    https://sourceware.org/gdb/wiki/BuildingOnDarwin#Giving_gdb_permission_to_control_other_processes
    for more information.
割りと詳しい。はまったとき一読すべきかも。


ここからコード署名というのをする。証明書を作る作業が結構長い。

(1)
キーチェーンアクセスを起動する。
open -a "Keychain Access.app"
(2)
[キーチェーンアクセス] → [証明書アシスタント] → [証明書を作成] として[証明書アシスタント]というウィンドウを出す。
(3)
「以下の証明書情報を入力してください:」に対して、 名前は “gdb-cert” にでもして、 (固有名のタイプは[自己署名ルート]のまま) 証明書のタイプは [コード署名] を選択し, [デフォルトを無効化] をチェックする。 [続ける] ボタンを何度か(6回くらい)クリックする。
(4)
[拡張鍵用途選択領域] の「許可される操作」 で [コード署名] にチェックを入れる。[続ける]を(3回)押す。
(5)
「証明書の場所を指定」に対して、 とりあえず証明書の場所は [ログイン] にしておく ([システム] にしてもエラーになってしまう)。 [作成] ボタンを押す。[完了] を押す。
(6)
「キーチェーンアクセス」ウィンドウの分類で、「証明書」を選択する。 [ログイン] キーチェーンに “gdb-cert” という証明書が出来ているはず。 これを [システム] までドラッグ&ドロップする。 キーチェーン・パスワードというのを要求されたりするが、 デフォールトではログイン・パスワードと一致しているので、 ログイン・パスワードを入力すれば多分大丈夫。
(7)
gdb-cert 証明書をダブル・クリックして開き、 「信頼」の「この証明書を使用するとき」で「常に信頼」を選択して閉じる。 パスワード入力を要求される。
(8)
taskgated を再起動する (どうやる? kill すれば自動的に 再起動されるように書いている人がいるが、 試したところそうならず、結局は Mac を再起動した)。

(2018/9/14 追記 必要になった時点で再起動される、 ということらしく OS の再起動は不要みたいだ。
ps auxw | grep taskgated
sudo kill -9 taskgatedのプロセスID
(プロセスIDというのは、2列目にある整数)
実例
[katsurada-no-MacBook-Air-3:~/work] mk% ps aux | grep taskgated
root               754   4.4  0.1  4296220   2468   ??  Ss   木03PM   2:53.56 /usr/libexec/taskgated -s
mk               64481   0.0  0.0  4267752   1012 s004  S+   12:05PM   0:00.00 grep taskgated
[katsurada-no-MacBook-Air-3:~/work] mk% sudo kill -9 754
Password:
[katsurada-no-MacBook-Air-3:~/work] mk%
)

(9)
sudo codesign -fs gdb-cert /opt/local/bin/ggdb
確認するには codesign -vd /opt/local/bin/ggdb とすれば良い。 security find-identity -p codesigning -v

~/.gdbinitset startup-with-shell off と書き足す。
echo "set startup-with-shell off" >> ~/.gdbinit

ggdb という名前にする理由はないと思うので
alias gdb=ggdb
としておく。emacs の中で実行するときエイリアスは見てくれないので、 エイリアスよりはリンクするのが良いかも。そのためには
pushd /opt/local/bin
sudo ln -s ggdb gdb
popd


以上の設定について、色々な資料を参考にしたが、主なものは次の2つ (大筋は 1 の通りだが、macOS 10.13 ではそのままでは通用しなくなった)。

  1. 「OS XでGDBを使う(ためにコード署名をする)」 (2013/11/30)
  2. mac OS 10.13(High Sierra) で gdb を使う


(2018/9/14) 上に書いたようにしてうまく動くMacと、そうでないMacがある。 違いの理由はわからない。

(2018/9/14) 1台だけ残っていた El Capitan の Mac に試しにインストール&設定してみたら 無事に動作した。

(2018/9/17) 動かない Mac があると書いたけれど、remote login すると動かない、だった。 その Mac のキーボードから操作すれば使えた。 remote login した場合も
sudo gdb ファイル名
のように sudo をすれば動いた。

(2018/9/18) 学生の MacBook に上の手順でインストールしてみた。 OS が Sierra だったけれど無事に動作した。


gdb は久しぶりなのでコマンドがうろ覚えだ… (この5年ほぼ Mac オンリーだったので 5 年のブランク?)

とりあえず。

なかなか充実しているように感じた。 emacs の中で M-x gdb とするのが良いかも (ずっと以前に試したときよりも改善されている感じ)。


メモ

ライブラリィのデバッグをどうするのかな…やってみたら普通に出来た。

桂田 祐史
2020-04-05