Homebrew でインストールした GDB で実行中のプロセスにアタッチする際に,以下のようなエラーが出て制御を移せない場合がある.

(gdb) attach 923
Attaching to process 923
Unable to find Mach task port for process-id 923: (os/kern) failure (0x5).
 (please check gdb is codesigned - see taskgated(8))

これは,Darwin カーネルがセキュリティリスクを回避するために,署名されていないソフトウェアによるデバッグを禁止しているためである. デバッグを可能にするには,手動で GDB にコード署名を行う必要がある.

このことは Homebrew でインストールした際のログにしっかり明記されている.

$ brew install gdb
(snip)
==> Caveats
gdb requires special privileges to access Mach ports.
You will need to codesign the binary. For instructions, see:

  https://sourceware.org/gdb/wiki/BuildingOnDarwin

On 10.12 (Sierra) or later with SIP, you need to run this:

  echo "set startup-with-shell off" >> ~/.gdbinit
(snip)

公式 Wiki を見ながら Keychain Access.app で自己署名証明書を作成し,GDB の実行ファイルにコード署名すれば,GDB でデバッグが可能になる. 手順を簡単にまとめると,以下のとおりである.

自己署名証明書の作成

キーチェーンアクセスを開く.

open -a 'Keychain Access'

アプリケーションメニューの Keychain Access → Certificate Assistant → Create a Certificate… を選択し,以下のとおり設定して Create ボタンを押下する.

項目
Name gdb-cert
Identity Type Self Signed Root
Certificate Type Code Signing
Let me override defaults チェックする

“Specify a Location For The Certificate” の画面が表示されるまで Continue ボタンを押下,Keychain を System に設定して Create ボタンを押下する.

最後に,作成した証明書を選択し,”When using this certificate” を “Always Trust” に変更する.

コード署名

Catalin

現在,Catalina では GDB が正常に動かない問題がある.

Mojave

gdb-entitlement.xml という名前で以下の内容のファイルを作成する.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.security.cs.debugger</key>
    <true/>
</dict>
</plist>
</pre>

資格情報の付与とコード署名を行う.

codesign --entitlements gdb-entitlement.xml -fs gdb-cert $(which gdb)

正常に署名 & 資格情報の付与ができていることを確認する.

$ codesign -vv $(which gdb)
/usr/local/bin/gdb: valid on disk
/usr/local/bin/gdb: satisfies its Designated Requirement
$ codesign -d --entitlements - $(which gdb)
Executable=/usr/local/Cellar/gdb/8.3/bin/gdb
<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0">
 <dict>
     <key>com.apple.security.cs.debugger</key>
     <true/>
 </dict>
 </plist>
 </pre>

Mojave より前

コード署名を行う.

codesign -fs gdb-cert $(which gdb)

正常に署名 & 資格情報の付与ができていることを確認する.

$ codesign -vv $(which gdb)
/usr/local/bin/gdb: valid on disk
/usr/local/bin/gdb: satisfies its Designated Requirement