1. 程式人生 > >MAC上使用gdb(完美解決)

MAC上使用gdb(完美解決)

由於要在mac上製作自己的malloc動態儲存分配器,要使用gdb進行除錯,之前一直在centos上用gdb除錯,轉到mac上竟然發現有這麼多坑,還好一一解決了,其原因大多數因為mac上非常關注程式安全性的問題。
主要會碰到的問題主要有如下問題,如果大家發現如下的問題就可以接著看下去:
1.-bash: gdb: command not found
2. `Starting program: /x/y/foo

Unable to find Mach task port for process-id 28885: (os/kern) failure (0x5).

(please check gdb is codesigned - see taskgated(8))
3.

The specified item could not be found in the keychain.
4.
During startup program terminated with signal SIG113, Real-time event 113`

我們一個個來解決。
1. -bash: gdb: command not found
這個原因在於你的mac上根本沒有下載gdb這個除錯工具。那麼,解決辦法也很簡單,把gdb下載下來。
使用mac自帶的brew管理工具。當然,要先更新一下homebrew的軟體庫。

brew update

然後檢查一下homebrew軟體庫裡面有沒有gdb

brew search gdb

如果有的話,就會有如下圖片展示:
這裡寫圖片描述
有的話,進行安裝

brew install gdb

如果要許可權的話就加個sudo。
安裝成功之後,鍵入gdb檢視是否安裝成功

這裡寫圖片描述

安裝成功之後,我們是不是就可以大功告成開始除錯了呢。。?往往事實是殘酷的。
這裡寫圖片描述
在第一次安裝的往往出現剩下四個問題。
現在來看第二個問題:

Starting program: /x/y/foo

Unable to find Mach task port for process-id 28885: (os/kern) failure (0x5).

 (please check gdb is
codesigned - see taskgated(8))

這個原因是mac不允許沒有給予許可的程序來除錯其它程序,那解決辦法自然就想到了root,來個根許可權。但是,這個會影響到萬一gdb除錯了重要核心程式後果不是我們想要的,沒有安全證書,我們就自己新增一個安全證書:
首先開啟鑰匙串訪問
這裡寫圖片描述
這裡寫圖片描述
下面關鍵要修改的東西如下:
這裡寫圖片描述
注意一定鑰匙程式碼簽名,英文名是codesign,上面的名稱隨意,這個跟你後面的命令列鍵入的名稱有關,接下來,一直往下
這裡寫圖片描述
把這個鑰匙串改成system,然後建立由於我已經建立過了,這裡就不顯示出來了。
這裡寫圖片描述
雙擊,將信任改成始終信任:
這裡寫圖片描述

中間要輸入密碼之類的,輸入就是了。
OK,只差最後一步
重啟電腦。
然後在命令列上輸入:

codesign -s gdb-cert-hekewen /usr/local/bin/gdb

這個gdb-cert-hekewen,要改成你的證書名,後面就是gdb位置。
沒有報錯就是成功了。
3.The specified item could not be found in the keychain.
這個就是在鑰匙串裡面沒有找到該簽名,這個錯誤往前面看你的安全證書是否按照上面的步驟解決,特別注意證書名字,證書型別,信任,系統,這些有沒設定成功。

4.During startup program terminated with signal SIG113, Real-time event 113
這個錯誤好像只有在高版本的OSX系統上才出現,解決辦法就是在gdb啟動的時候,鍵入命令

set startup-with-shell off

就解決了
當然,如果這樣,你每次在除錯的時候都要鍵入,這時候你就可以新增到.gdbinit,每次執行gdb的時候都執行一次。
關於.gdbinit,就是在你每次用gdb調整程式的時候,如果程式檔案中有.gdbinit,就會自動讀取裡面的命令,全部執行一遍。
於是乎,我們只要用vim在程式檔案裡面建立一個.gdbinit,並在裡面寫上set startyup-with-shell off
就解決了。
終於,我們可以開心的在mac上使用gdb了。