副標題:Mac上的gdb沒法正常調試的問題
shell
Mac上用brew install gdb
安裝gdb後,沒法正常的運行run
命令,報錯以下:macos
(gdb) break main Breakpoint 1 at 0x100000f66: file a.c, line 4. (gdb) run Starting program: /Users/solomonxie/Workspace/tests/clang/a Unable to find Mach task port for process-id 63414: (os/kern) failure (0x5). (please check gdb is codesigned - see taskgated(8))
這個不是c程序的問題,也不是gdb的問題,而是Mac的問題。vim
參考:gdb doesn't work on macos High Sierra 10.13.3api
爲何Mac不能調試?安全
"由於 Darwin 內核在你沒有特殊權限的狀況下,不容許調試其它進程。調試某個進程,意味着你對這個進程有徹底的控制權限,因此爲了防止被惡意利用,它是默認禁止的。容許 gdb 控制其它進程最好的方法就是用系統信任的證書對它進行簽名。"
參考:gdb fails with 「Unable to find Mach task port for process-id」 error
參考:How to install and codesign GDB on OS X El Capitan服務器
具體步驟以下:app
用Spotlight搜索Directory Utility
程序,打開後,點擊左下角解鎖,而後打開菜單->Edit->Enable root user
->建立密碼。ide
/System/Library/LaunchDaemon/com.apple.atrun.plist
文件將第22行的-s
改成-sp
而後保存退出。學習
通常來說管理員是沒有權限修改的,因此須要重啓進入「安全模式」用root權限解開系統文件的保護,再重啓,修改文件,再重啓進入安全模式,再開啓系統文件保護,再重啓回到正常系統。
步驟爲:
重啓,黑屏時按住Ctrl-r
不鬆手一直到蘋果標誌出現。進入安全模式後,打開菜單Utilities-Terminal終端,輸入csrutils disable
解鎖系統文件保護。而後重啓,回到正常系統中,sudo vim /System/Library/LaunchDaemon/com.apple.atrun.plist
將文件中22行-s
改成-sp
,保存退出。重啓再次進入安全模式,命令行輸入csrutils enable
鎖定系統文件保護。再重啓,回到正常系統,進行下一步。測試
brew uninstall --force gdb
打開系統的Applications -> Utilities -> Keychain Access
刪除全部gdb相關的證書。
brew install gdb
打開系統keychain管理器:Keychain Access, go to menu Keychain Access-> Certificate Assistant -> Create a Certificate
。
建立新的證書,所填內容以下:
Name : gdb-cert Identity Type: Self Signed Root Certificate Type : Code Signing [X] Let me override defaults Serial Number : 1 Validity Period (days): 3650 Key Size : 2048 Algorithm : RSA [X] Include Key Usage Extension [X] This extension is critical Capabilities: [X] Signature [X] Include Extended Key Usage Extension [X] This extension is critical Capabilities: [X] Code Signing [X] Include Subject Alternate Name Extension Keychain: System
在Keychain管理器裏,雙擊剛剛建立好的證書,在Trust
中所有選擇爲Always Trust
:
再打開命令行輸入:
sudo killall taskgated codesign -fs "gdb-cert" `which gdb` launchctl load /System/Library/LaunchDaemons/com.apple.taskgated.plist
進入gdb調試程序,而後輸入命令:
(gdb) set startup-with-shell off
而後正式開始調試。
若是調試沒有問題,則將set startup-with-shell off
這句話寫入~/.gdbinit
文件中,長久生效。
由於看到有人是因爲更新了gdb或更新了os系統後才遇到問題,因此想是否是gdb版本與當前os版本不合的問題。
因此決定本身編譯別的版本gdb。
官方各個版本的下載地址:https://ftp.gnu.org/gnu/gdb/
(通過測試,個人在MacOS 10.12 Sierra上編譯各個新老版本gdb都編譯不成功)
開始下載編譯:
cd /tmp wget https://ftp.gnu.org/gnu/gdb/gdb-7.12.1.tar.gz cd gdb-*/ ./configure --prefix=/opt/gdb-7.12 && echo [ OK ] make && echo [ OK ] sudo make install && echo [ OK ]
我當前的系統是MacOS 10.12 Sierra。相關的說法是:
"None GDB 7.11 or 7.12.1 will not work on Sierra 10.12.4 In short it's because of Apple security upgrade. We need to wait for re-enabling when some new version will shows up."
順着這條思路搜索,找到一個有人已經編譯好的gdb
二進制單文件。而後再用codesign
給它簽名,居然就能夠用了!
在這裏下載gdb_7.12.1_ sierra .zip
或在百度網盤下載。
解壓後,備份並替換本機的gdb,放到/usr/local/bin/
中。而後pkill taskgated
並codesign -s gdb-cert /usr/local/bin/gdb
進行簽名。
可是直接gdb
還不行,須要用sudo gdb ..
才能正經常使用。
注意:從新安裝gdb後。第三方軟件如cgdb
,須要從新安裝才能使用,不然徹底沒法用。
Mac上LLDB
纔是王道。Xcode默認調試器是LLDB,說明了蘋果不鳥GNU。也有人說,GDB是過去,LLDB是未來。雖然不必定正確,但也證實了LLDB也很強大。
再有一點最重要的理由:你的項目生產環境真的是在Mac上嗎?
既然生產環境不在Mac,爲何要用Mac編譯?
這個邏輯一想通,就全通了—— 通常生產環境是在Linux服務器上的,因此你大能夠共享項目文件夾給服務器,而後SSH進服務器進行編譯調試。
若是隻是學習語言用的小文件,那麼更不必用到強大的GDB功能,在Mac本地用LLDB便可。
因此,惟一的缺點就是用不了各種GDB的衍生品、GUI一類,排除這點,仍是安心用LLDB吧,不要在Mac上折騰GDB了。。。