macOS で GDB を使うための設定
私の環境
intel core i5 で macOS 14.5 を使っています。
$ sw_vers
ProductName: macOS
ProductVersion: 14.5
BuildVersion: 23F79
GDB のインストール
macOS にはデフォルトで GDB がインストールされていないので、Homebrew でインストールします。
brew install gdb
証明書の作成
macOS ではセキュリティのために、デバッガーに対して署名が必要です。
まず、keychain access を開き、Certificate Assistant -> Create a Certificate を選択します。
次に、証明書の情報を入力します。Name は gdbcert
などわかりやすい名前をつけてください。identity type は Self Signed Root
を選択し、Certificate Type は Code Signing
を選択します。また、Let me override defaults にチェックを入れてください。
次に、Validity Period を入力します。ここでは 3650 日を入力しました。
しばらくデフォルトの状態で進みます。
最後に、Keychain に証明書を追加します。Keychain には System
を選択してください。
Password が求められますので、入力します。最後に以下のような画面が表示されれば成功です。
証明書の設定
次に、作成した証明書を開き、Trust を開き、When using this certificate を Always Trust
に変更します。
Code Signing
最後に、作成した証明書を使って GDB を署名します。
まずは普通に署名します。
codesign -s gdbcert /usr/local/bin/gdb
このままだと GDB を実行する際にsudo
が必要になりますので、さらに設定をおこないます。適当な場所で、以下のようなスクリプトを作成し、gdb-entitlement.xml
などの名前で保存します。ここでは、~/gdb-entitlement.xml
に保存したと仮定します。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.cs.allow-dyld-environment-variables</key>
<true/>
<key>com.apple.security.cs.debugger</key>
<true/>
</dict>
</plist>
次に、以下のコマンドを実行します。gdb-entitlements.xml
のパスは先ほど保存したファイルのパスを指定してください。
codesign --entitlements ~/gdb-entitlements.xml -fs gdbcert /usr/local/bin/gdb
これで、GDB を実行する際に sudo
が不要になります(run
を実行した際にパスワードが求められます)。
テスト
以下のようなプログラムを作成します。ここでは、main.c
という名前で保存しました。
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
次に、コンパイルします。
gcc -g -o main main.c
最後に、GDB で以下のようにmain
関数にブレークポイントを設定して実行してみましょう。Code Signing が成功していれば、以下のような画面が表示されます。
$ gdb ./main
GNU gdb (GDB) 14.2
Copyright (C) 2023 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin23.2.0".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./main...
(No debugging symbols found in ./main)
(gdb) b main
Breakpoint 1 at 0x100000f86
(gdb) run
Starting program: /path/to/main
[New Thread 0x1603 of process 14799]
[Thread 0x1603 of process 14799 exited]
[New Thread 0x2003 of process 14799]
warning: unhandled dyld version (17)
Thread 2 hit Breakpoint 1, 0x0000000100000f86 in main ()
(gdb) info reg sp
sp 0x7ff7bfefec90 0x7ff7bfefec90
(gdb) x/32xg $sp
0x7ff7bfefec90: 0x00007ff7bfefeeb0 0x00007ff80438a366
0x7ff7bfefeca0: 0x0000000000000000 0x0000000000000000
0x7ff7bfefecb0: 0x0000000000000000 0x0000000000000000
0x7ff7bfefecc0: 0x00007ff7bfefee40 0x0000000100100030
0x7ff7bfefecd0: 0x0000000000000000 0x0000000000000000
0x7ff7bfefece0: 0x0000000000000000 0x0000000000000000
0x7ff7bfefecf0: 0x000000010009d000 0x0000000000002000
0x7ff7bfefed00: 0x000000010009f000 0x000000000004c000
0x7ff7bfefed10: 0x0000000000000000 0x0000000000000000
0x7ff7bfefed20: 0x0000000000000000 0x0000000000000000
0x7ff7bfefed30: 0x0000000000000000 0x0000000000000000
0x7ff7bfefed40: 0x0000000000000000 0x0000000000000000
0x7ff7bfefed50: 0x0000000000000000 0x0000000000000000
0x7ff7bfefed60: 0x0000000000000000 0x0000000000000000
0x7ff7bfefed70: 0x0000000000000000 0x0000000000000000
0x7ff7bfefed80: 0x0000000000000000 0x0000000000000000
(gdb) info registers
rax 0x100601910 4301265168
rbx 0x100601b90 4301265808
rcx 0x7ff7bfeff070 140702053822576
rdx 0x7ff7bfefeee0 140702053822176
rsi 0x7ff7bfefeed0 140702053822160
rdi 0x1 1
rbp 0x7ff7bfefec90 0x7ff7bfefec90
rsp 0x7ff7bfefec90 0x7ff7bfefec90
r8 0x0 0
r9 0x8000 32768
r10 0x0 0
r11 0x202 514
r12 0x7ff7bfefecc0 140702053821632
r13 0x0 0
r14 0x100000f82 4294971266
r15 0x7ff7bfefee40 140702053822016
rip 0x100000f86 0x100000f86 <main+4>
eflags 0x206 [ PF IF ]
cs 0x2b 43
ss <unavailable>
ds <unavailable>
es <unavailable>
fs 0x0 0
gs 0x0 0
fs_base <unavailable>
gs_base <unavailable>
(gdb)
Discussion