Mac Catalina 下 gdb codesign問題解決

在 macOS 上,無法直接使用 gdb 進行 debug。

這是因爲 Darwin 內核在你沒有特殊權限的情況下,不允許調試其它進程。調試某個進程,意味着你對這個進程有完全的控制權限,所以爲了防止被惡意利用,它是默認禁止的。允許 gdb 控制其它進程最好的方法就是用系統信任的證書對它進行簽名。

但是目前我所使用的 macOS 版本是 macOS Cataline,在網上大多數方案中都缺少某些步驟,最終才能運行,這裏作出說明。
@

傳統步驟

創建證書

按入下步驟創建代碼簽名的證書:

打開 Keychain Access 應用程序(/Applications/Utilities/Keychain Access.app)

執行菜單 鑰匙串訪問 -> 證書助理 -> 創建證書

填寫如下信息:

名稱:gdb_codesign

身份類型:自簽名根證書

證書類型:代碼簽名

鉤選:讓我覆蓋這些默認設置

一路確定,直到指定證書位置的步驟,選擇系統

點擊“創建”,會提示用輸入系統登錄密碼,創建完成

在鑰匙串訪問程序中,選擇左側欄的系統和我的證書,找到你剛剛創建的gdb_codesign證書並雙擊打開證書信息窗口,展開信任項,設置使用此證書時:爲始終信任。

關閉證書信息窗口,系統會再次要求輸入系統登錄密碼。

對 gdb 簽名

執行下面的命令:

codesign -s gdb_codesign gdb
執行上面的命令時,系統會再次驗證身份。
完成後一定要重啓系統,這個很重要,否則簽名不會生效。

如果出現下面的錯誤:

MacBook:~ sam$ codesign -s gdb_codesign gdb
gdb: No such file or directory

那麼就指定 gdb 的全路徑。

新版系統需要做出的變化

如果是之前的系統,直接執行:
codesign -fs gdb-cert $(which gdb)

如果是 Mojave (10.14) 之後的系統,
先創建一個文件 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)

希望能幫到大家。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章