標籤:des class blog code http tar
XCode4.0以後,編譯器是LLVM,控制台調試命令首碼是lldb
第一、LLVM簡介
LLVM是構架編譯器(compiler)的架構系統,以C++編寫而成,用於最佳化以任意程式語言編寫的程式的編譯時間(compile-time)、連結時間(link-time)、已耗用時間(run-time)以及空閑時間(idle-time),對開發人員保持開放,併兼容已有指令碼。
第二、 對關注編譯技術的開發人員,LLVM提供了很多優點:
現代化的設計LLVM的設計是高度模組化的,使得其代碼更為清晰和便於排查問題所在。語言無關的中間代碼一方面,這使得透過LLVM能夠將不同的語言相互連結起來;也使得LLVM能夠緊密地與IDE互動和整合。另一方面,發布中間代碼而非目標代碼能夠在目標系統上更好地發揮其潛能而又不傷害可調試性(i.e. 在目標系統上針對原生硬體環境產生目標代碼,但又能夠直接通過中間代碼來進行行級調試)作為工具和函數庫使用LLVM提供的工具可以比較容易地實現新的程式設計語言的最佳化編譯器或VM,或為現有的程式設計語言引入一些更好的最佳化/調試特性。第三、使用前提:
1.既然是調試命令,理所當然的,程式模式應該選擇Debug模式。
2.在Debug模式下,如果你的程式在運行中崩潰(Crash)掉,那麼恭喜你,使用lldb調試的機會來了。
符合以上兩個條件之後,控制台(即日誌輸出視窗All Output)會自動打出一個(lldb)命令,此時你就可以進行調試。
第四、常用的調試命令
po
po是print-object的簡寫,可用來列印所有NSObject對象。sample code:
(lldb) po self.view
<UITableView: 0xdb00200; frame = (0 20; 320 460); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x8b3ca50>; layer = <CALayer: 0x8b3c110>; contentOffset: {0, 0}>
(lldb) po self
<RootViewController: 0x9813e90>
p
p是print的簡寫,可以用來列印所有的簡單類型,如int, float,結構體等。sample code:
[objc] view plaincopyprint?
- ItemData item;
- item.nMainID=1;
- item.nSubID=2;
- item.pszTitle=@"hello";
-
- NSRect rect=NSMakeRect(0, 10, 10, 10);
調試命令及輸出結果:
(lldb) print rect
(NSRect) $0 = (x=0, y=10), (width=10, height=10)
(lldb) p item
(ItemData) $3 = {
pszTitle = 0x0000000100001370 @"hello"
nMainID = 1
nSubID = 2
}
call
call即是調用的意思。其實上述的po和p也有調用的功能。因此一般只在不需要顯示輸出,或是方法無傳回值時使用call
bt
這時Xcode會自動輸出最後的一次呼叫堆疊
當然還有其他的命令(和gdb命令通用):
[cpp] view plaincopy 命令 解釋 break NUM 在指定的行上設定斷點。 bt 顯示所有的調用棧幀。該命令可用來顯示函數的調用順序。 clear 刪除設定在特定源檔案、特定行上的斷點。其用法為:clear FILENAME:NUM。 continue 繼續執行正在調試的程式。該命令用在程式由於處理訊號或斷點而導致停止運行時。 display EXPR 每次程式停止後顯示運算式的值。運算式由程式定義的變數組成。 file FILE 裝載指定的可執行檔進行調試。 help NAME 顯示指定命令的協助資訊。 info break 顯示當前斷點清單,包括到達斷點處的次數等。 info files 顯示被調試檔案的詳細資料。 info func 顯示所有的函數名稱。 info local 顯示當函數中的局部變數資訊。 info prog 顯示被偵錯工具的執行狀態。 info var 顯示所有的全域和靜態變數名稱。 kill 終止正被調試的程式。 list 顯示原始碼段。 make 在不退出 gdb 的情況下運行 make 工具。 next 在不逐步執行進入其他函數的情況下,向前執行一行原始碼。 print EXPR 顯示運算式 EXPR 的值。 print-object 列印一個對象 print (int) name 列印一個類型 print-object [artist description] 調用一個函數 set artist = @"test" 設定變數值 whatis 查看變理的資料類型 註:借鑒自richard_如風的專欄和liangguo03的專欄的部落格