C
MacOSX
homebrew
gdb
HighSierra

mac OS 10.13(High Sierra) で gdb を使う

mac OS 10.13(High Sierra) で gdb を使おうとした際にハマったのでメモ。

gcc のバージョン

Xcode インストール時にインストールされていたっぽい。

$ gcc -v
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 9.0.0 (clang-900.0.39.2)
Target: x86_64-apple-darwin17.3.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

Homebrew のインストール

gdb をインストールするために Homebrew をインストールする。

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

インストール後にバージョンを確認する。

$ brew -v
Homebrew 1.4.2

gdb のインストール

$ brew install gdb

インストール後にバージョンを確認する。

$ gdb -v
GNU gdb (GDB) 8.0.1
Copyright (C) 2017 Free Software Foundation, Inc.
...

テストプログラムの作成

gdb の動作確認用に以下のようなテストプログラムを作成する。

test.c
#include <stdio.h>

int main(void) {
    printf("test\n");
    return 0;
}

test.c をビルドする。

$ gcc -g test.c -o test

ここで実行してみる。

$ gdb ./test
GNU gdb (GDB) 8.0.1
Copyright (C) 2017 Free Software Foundation, Inc.
...

(gdb) b main
Breakpoint 1 at 0x100000f64
(gdb) run
Starting program: (プログラムのパス) 
Unable to find Mach task port for process-id xxxx: (os/kern) failure (0x5).
 (please check gdb is codesigned - see taskgated(8))

コード署名をしてくださいというエラーが出ている。

gdbコード署名用の証明書の作成

キーチェーンアクセス メニューから、gdbのコード署名用の証明書を作成する。

こちらの情報を参考にさせていただきました。
https://qiita.com/takahashim/items/204ffa698afe09bd4e28

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

gdb のコード署名

以下のコマンドを実行して gdb のコード署名を行う。

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

gdb の実行

先ほどエラーになっていたテストプログラムを再度実行してみる。

$ gdb ./test
GNU gdb (GDB) 8.0.1
Copyright (C) 2017 Free Software Foundation, Inc.
...

(gdb) b main
Breakpoint 1 at 0x100000f6f: file test.c, line 4.
(gdb) run
Starting program: (プログラムのパス) 
[New Thread 0x1703 of process 7926]
warning: unhandled dyld version (15)

Thread 2 hit Breakpoint 1, main () at test.c:4
4       printf("test\n");
(gdb) s
test
5   }
(gdb) s
[Inferior 1 (process 7926) exited normally]
(gdb) quit

無事実行できた:slight_smile:
ターミナルからの実行はできるようになったが、Eclipse CDT からのデバッグでさらにハマったので別途書く予定。

[追記] 書きました。

参考