在 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)
希望能幫到大家。