mac下安裝使用gdb除錯
安裝
brew install gdb 安裝gdb
start除錯報錯
Unable to find Mach task port for process-id 15634: (os/kern) failure (0x5).
During startup program terminated with signal ?, Unknown signal.
證書建立過程參考:
http://www.jianshu.com/p/99b057d5566f
google說沒有code-sign,安裝步驟一步一步證書籤名認證,重啟電腦,還是報錯:
Starting program: /Users/Nj/www/C/test/test
[New Thread 0x1603 of process 1648]
warning: unhandled dyld version (15)
> echo "set startup-with-shell off" >> ~/.gdbinit 按照提示資訊建立gdbinit檔案,並更改許可權755
關掉終端,重啟系統,終於可以start了~~~
gdb使用
gdb常用命令
file
裝入想要除錯的程式
run
執行當前被除錯的程式
kill
終止當前被除錯的程式
step
執行一行原始碼而且進入函式的內部
next
執行一行原始碼,但不進入函式的內部
break
在程式碼裡設定斷點,會使程式執行到這裡時被掛起
print
display
設定自動顯示的表示式或者變數,當程式停住或者再單步跟蹤的時候,這些變數會自動顯示當前值 list
列出產生執行檔案的原始碼的一部分 quit
退出gdb watch
監視一個變數的值 backtrace
回溯跟蹤 frame n
定位到發生錯誤的程式碼段 n為backtrace命令的輸出結果中的行號 examine
檢視記憶體地址中的值 jump
使程式跳轉 signal
產生訊號量 return
強制函式返回 call
強制呼叫函式 make
使使用者不退出gdb就可以重新產生可執行檔案 shell
p(print)<expr>
列印變數的值
p/x
十六進位制列印
p/d
十進位制列印
p/u
十六進位制無符號數列印
p/o
八進位制列印
p/t
二進位制列印
p/c
按字元格式
s(step)
執行下一條指令,並進入指令的內部
n(next)
執行下一條指令,不進入指令的內部
display
自動顯示變數的值
undisplay
刪除自動顯示
disable display <dnum>
不刪除,只是讓它失效
info display
顯示所有設定的自動顯示
x(examine)
檢視記憶體
x/<n/f/u> <addr>
n是正整數,表示顯示的記憶體長度,也就是從當前地址向後顯示幾個地址的內容
f是顯示的格式字串格式s 指令地址i
u表示從當前地址向後顯示幾個位元組預設4個,b表示單位元組、h表示雙位元組、w表示4個位元組、g表示8個位元組
show convenice
顯示所有的環境變數
set $foo = bar
設定一個環境變數
set $a = 1;
p $a + 1; //可以得到2
info registers
顯示暫存器的情況(不包括浮點暫存器)
info all-register
檢視所有暫存器的情況
info registers <regname>
檢視指定暫存器的情況
也可以使用print檢視,只需要在暫存器的名字前加上一個$
符號就可以了
檢視源程式
list <linenum>
顯示指定行周圍的程式碼
list <function>
顯示函式名為function的函式的源程式
list <first>,<end>
顯示first end之間的程式碼
show listsize
檢視當前設定的顯示行數
set listsize <count>
設定一次顯示的行數
list
顯示當前行後邊的源程式
disassemble
檢視程式的彙編程式碼
改變程式的執行
使用print num=.. 來改變程式中的值
檢視記憶體地址
info line X
X可以是行號、檔名:行號、函式名、檔名:函式名的形式
跳轉執行
jump <linespec>
linespec可以是檔案行號,也可以是file:line的形式或者是+num這種格式,表示下一條執行語句從哪裡開始
jump <address>
表示跳轉到哪一程式碼行的執行地址
return <expr>
強制函式返回
call <expr>
強制呼叫函式
show language
檢視當前的語言環境
info frame
檢視當前函式的程式語言
info source
檢視當前檔案的程式語言