Mac上的gdb之:從入門到放棄

副標題: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

開啓root權限

用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鎖定系統文件保護。再重啓,回到正常系統,進行下一步。測試

刪除全部現有的gdb版本:

brew uninstall --force gdb

打開系統的Applications -> Utilities -> Keychain Access刪除全部gdb相關的證書。

從新安裝gdb:

brew install gdb

建立證書

打開系統keychain管理器:Keychain Access, go to menu Keychain Access-> Certificate Assistant -> Create a Certificate

image

建立新的證書,所填內容以下:

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:

image

重啓taskgated並codesign將程序與證書關聯

再打開命令行輸入:

sudo killall taskgated
codesign -fs  "gdb-cert"  `which gdb`
launchctl load /System/Library/LaunchDaemons/com.apple.taskgated.plist

設置set startup-with-shell off

進入gdb調試程序,而後輸入命令:

(gdb) set startup-with-shell off

而後正式開始調試。

若是調試沒有問題,則將set startup-with-shell off這句話寫入~/.gdbinit文件中,長久生效。

若是經歷了這一切都沒用,那麼試試本身編譯第三方gdb

由於看到有人是因爲更新了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  ]

若是仍是沒用,那麼須要針對本身的OS版本作調查了

我當前的系統是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 taskgatedcodesign -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了。。。

相關文章
相關標籤/搜索