🦎

macOS で GDB を使うための設定

2024/06/29に公開

私の環境

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 を選択します。

img1

次に、証明書の情報を入力します。Namegdbcert などわかりやすい名前をつけてください。identity typeSelf Signed Root を選択し、Certificate TypeCode Signing を選択します。また、Let me override defaults にチェックを入れてください。

img1

次に、Validity Period を入力します。ここでは 3650 日を入力しました。

img1

しばらくデフォルトの状態で進みます。

img1

img1

img1

img1

img1

img1

最後に、Keychain に証明書を追加します。Keychain には System を選択してください。

img1

Password が求められますので、入力します。最後に以下のような画面が表示されれば成功です。

img1

証明書の設定

次に、作成した証明書を開き、Trust を開き、When using this certificateAlways Trust に変更します。

img1

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