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

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

# gcc のバージョン

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

```bash
$ 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 をインストールする。

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

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

```bash
$ brew -v
Homebrew 1.4.2
```

# gdb のインストール

```bash
$ brew install gdb
```

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

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

# テストプログラムの作成

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

```c:test.c
#include <stdio.h>

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

test.c をビルドする。

```bash
$ gcc -g test.c -o test
```

ここで実行してみる。

```bash
$ 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 のコード署名を行う。

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

# gdb の実行

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

```bash
$ 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 からのデバッグでさらにハマったので別途書く予定。

[追記] 書きました。

* mac OS 10.13(High Sierra) で Eclipse のデバッグに gdb を使う  
https://qiita.com/yuzu_afro/items/17111ff1655116aa0a96

# 参考

* [OS XでGDBを使う（ためにコード署名をする）]
(https://qiita.com/takahashim/items/204ffa698afe09bd4e28)

* [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)