xcode lldb gdb調試

應用調試:css

1html

xcode gdb/lldb調試命令

命令                        解釋    算法

break NUM               在指定的行上設置斷點。    數組

bt                      顯示全部的調用棧幀。該命令可用來顯示函數的調用順序。    xcode

clear                   刪除設置在特定源文件、特定行上的斷點。其用法爲:clear FILENAME:NUM。    瀏覽器

continue                繼續執行正在調試的程序。該命令用在程序因爲處理信號或斷點而致使中止運行時。    安全

display EXPR            每次程序中止後顯示錶達式的值。表達式由程序定義的變量組成。    app

file FILE               裝載指定的可執行文件進行調試。    iphone

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                  查看變理的數據類型   

 

2

這裏記錄一下本身學習到的一些XCode調試的方法。這些調試方法可讓咱們使用XCode編寫代碼進行調試時用起來更順心應手。

XCode的調試方法包括運行時設置斷點,打印到控制檯,手寫命令打印等。

1. 運行時設置斷點

在XCode中須要觀察的變量所在的代碼處添加斷點,可讓程序運行到這裏暫停。這時鼠標懸停在變量名處,XCode會顯示出該變量的信息。

斷點的類型分爲異常斷點(Exception Breakpoint)和符號斷點(Symbolic Breakpoint)等,在XCode斷點瀏覽器(Breakpoints Navigator)的左下方能夠添加這些斷點。

符號斷點中的符號能夠指方法名稱或函數名稱。符號斷點能夠中斷某個函數的調用。用戶還能夠添加執行斷點的條件。

 

異常斷點可使程序在每次發生異常時,都會被中斷。通常用來捕獲未知異常。

2. 打印到控制檯

控制檯位於XCode的底端,用於打印程序運行過程當中的輸出信息。在代碼中調用NSLog函數,能夠打印變量值到控制檯中顯示出來。

NSLog(@"obj:%@", obj);

須要特別注意的是,儘管NSLog可圈可點,但在實際應用中要防備其可能會引發安全問題,由於任何由NSLog輸出的內容都會成爲應用程序成品代碼

的一部分,也就是說會被任何接觸到應用的人看到。只要把設備接入信息管理工具,每一個人都能查看控制檯信息並查詢每一條日誌記錄。這可能會引起一系列嚴重後

果,例如向控制檯輸出機密邏輯算法或者用戶密碼等信息。

咱們可使用宏來解決調用NSLog方法可能致使的安全問題,只在調試版本中調用NSLog。能夠採用全局可訪問的頭文件,把全部日誌記錄都灌進去,並且不用擔憂它們會出如今成品代碼當中。

#ifdef DEBUG#define DMLog(...) NSLog(@"%s %@", __PRETTY_FUNCTION__, [NSString stringWithFormat:__VA_ARGS__])#else#define DMLog(...) do { } while (0)

如今若是咱們使用DMLog(這個名稱能夠隨便起),它將只向調試版本輸出結果,任何成品代碼都不會受到影響。PRETTY_FUNCTION也幫上了大忙,它會根據日誌信息來源爲函數命名。

3. 在控制檯端手寫命令打印

若是咱們在應用的特定點進行中斷,通常來講是爲了檢查對象的當前狀態。Xcode爲咱們提供了一套「variables view(變量視圖)」,該視圖位於Xcode底部,與控制檯相鄰的左方區域。理論上講它的做用是顯示與當前環境相關的全部值的實時狀態,但在實踐中有時沒法列出值,或者是並未將值更新爲中斷時的最新狀態。幸運的是,咱們能夠利用一些很是實用的控制檯(console)命令本身進行對象檢查工做。1

po 命令:爲 print object 的縮寫,顯示對象的文本描述。使用p 命令來處理純量值,即原生類型(boolean、integer、float等)。

print 命令:有點相似於格式化輸出,能夠輸出對象的不一樣信息。

expr 表達式:打印表達式。

info 命令:咱們能夠查看內存地址所在信息。

info line *內存地址:能夠獲取內存地址所在的代碼行相關信息。

show 命令:顯示 GDB 相關的信息。如:show version 顯示GDB版本信息。

bt: 顯示當前進程的函數調用棧的狀況;」up num」:查看調用的詳細信息;down:返回棧列表;l:顯示詳細代碼信息;p:輸出數值。

help 命令:若是忘記某條命令的語法了,用來獲取幫助信息。

須要注意的是,上述這些都是GDB的調試命令,在LLDB中會有所差別。隨着Xcode 5的發佈,LLDB調試器已經取代了GDB,成爲了Xcode工程中默認的調試器。

這裏須要強調的一個技巧是,經過使用expr 表達式可實如今運行時修改變量的值。2

expr username = @"username"expr password = @"badpassword"

經過上面的代碼段,變量username和password分別被從新賦值。

4. 設置NSZombieEnabled、MallocStackLogging、NSAutoreleaseFreedObjectCheckEnabled、NSDebugEnabled

第一種設置方法:

1. Product->Edit Scheme...->Run...->EnvironmentVariables.

2. add NSZombieEnabled,set the value with YES

3. add MallocStackLogging, set the value with YES.

4. add NSAutoreleaseFreedObjectCheckEnabled, set the value with YES.

5. add NSDebugEnabled, set the value with YES.

使用場景:

主要爲了解決EXC_BAD_ACCESS問題,MallocStackLogging用來啓用malloc記錄(使用方式 malloc_history${App_PID}${Object_instance_addr})。

第二種設置方法:

直接經過Editing Scheme窗口中的Run選項下的Diagnostics選項卡來設置。

須要注意的問題:

NSZombieEnabled只能在調試的時候使用,千萬不要忘記在產品發佈的時候去掉,由於NSZombieEnabled不會真正去釋放dealloc對象的內存。

5. 重寫respondsToSelector方法

實現方式

#ifdef _FOR_DEBUG_-(BOOL) respondsToSelector:(SEL)aSelector {    printf("SELECTOR: %s\n", [NSStringFromSelector(aSelector) UTF8String]);return[super respondsToSelector:aSelector]; }#endif

使用方法:

須要在每一個object的.m或者.mm文件中加入上面代碼(應該可使用類屬實現),而且在other c flags中加入-DFOR_DEBUG(記住請只在Debug Configuration下加入此標記)。這樣當你程序崩潰時,XCode的console上就會準確地記錄了最後運行的object的方法。

http://mobile.51cto.com/iphone-377138.htm「iOS故障排除指南:基本技巧」

http://my.oschina.net/notting/blog/115294「Xcode LLDB Debug教程」

http://www.2cto.com/kf/201210/162934.html「Xcode調試攻略」

在本文中,咱們的議題包括如下三點:

  • 利用控制檯檢查應用程序狀態;
  • 進行日誌記錄並深刻掌握NSLog操做方法;
  • 經過對象生命週期追蹤內存使用狀況。

利用控制檯進行檢查

位於Xcode底端的這位仁兄稱得上咱們調試工做中的最佳助手。輸出日誌信息、錯誤信息以及其它各種實用信息都是它的拿手絕活,這有助於咱們一步步鎖定應用錯誤。除了直接閱讀來自日誌記錄的輸出結果,你們還能夠在流程中的任意環節暫停,進而檢查應用程序的各個部分。

條件斷點

首先我假設你們已經瞭解存點的工做機制(若是還不瞭解也別擔憂,看完這幾段內容您也應該基本掌握這部分知識了)。斷點的做用很是重要,它可以幫咱們 查看應用程序在給定時間點上的所在位置——但在對象達到特定值並觸發斷點以後,再經過單步調試循環或者遞歸函數的作法實在是個痛苦的過程。這裏,咱們推薦 你們採用條件斷點。

條件斷點,顧名思義是指只會在特定條件下觸發的斷點。設想一下,當咱們只但願斷點在某對象在特定狀態或者「第n次」循環更替時發生,條件斷點就成爲 你們的不二選擇。在Xcode編輯器中點擊「gutter」來在代碼中添加一個斷點 ,右擊該斷點並選擇「edit breakpoint(編輯斷點)」爲其設置特殊條件。

你們能夠設置條件(例如i==12)或者設定循環中斷點被忽略的次數。固然,咱們也能夠採起其它一些自動觸發機制,例如在調試命令輸出值時啓用斷點。

  提示: 利用快捷鍵組合coomand+\可以快速添加或刪除斷點。

另外一項值得關注的斷點技巧是添加「exception breakpoint(異常斷點)」。不知道你們有沒有注意到,當咱們遇到異常狀況時,Xcode會有99%的機率將咱們引向主方法中的自動釋放池。

感謝Xocde……你可真會幫倒忙。

經過設定異常斷點,咱們就可以精肯定位引起異常狀況的代碼行。要作到這一點,首先得打開異常斷點選項卡(快捷鍵爲command+6)。在窗口底部 會出現一個「+」按鈕,點選該按鈕便可添加「異常斷點」。如今,一旦Xcode在運行中遭遇異常,即會在引起問題的代碼處中斷。

在控制檯端實現手動輸出

若是咱們在應用的特定點進行中斷,通常來講是爲了檢查對象的當前狀態。Xcode爲咱們提供了一套「variables view(變量視圖)」,該視圖位於Xcode底部、與控制檯相鄰。理論上講它的做用是顯示與當前環境相關的全部值的實時狀態。但在實踐中,這一做用有時 沒法正常生效。或者是沒法列出值,或者是並有將值更新爲中斷時的最新狀態,總之問題很多。

幸運的是,咱們能夠利用一些很是實用的控制檯命令本身進行對象檢查工做。在控制檯中輸入「po」來獲取特定對象的當前細節信息(咱們使用‘p’來處理純量值)。

這種方式在檢查某對象是否已經存在(若是對象不存在則輸出結果爲nil)、肯定對象值、查詢某數組/字典在當前運行狀態下的內容以及對兩個對象進行 比較等方面效果拔羣。因爲這條命令會輸出相關對象的內存地址,所以咱們能夠對本應相同的兩個對象進行輸出,查看兩者是否正確擁有相同的內存地址。

另外一條實用但卻經常被忽視的命令則是recursiveDescription,咱們能夠用它輕鬆檢查視圖。運行該命令後,系統會將視圖結構做爲結果輸出。

有效日誌記錄

在調試程序的過程當中,你們經常但願能將特定消息記錄到控制檯中。而「NSLog」函數容許用戶將任何想要的結果輸出至控制檯。對於但願以特定途徑梳 理應用程序或者沒法根據特定狀況一一設定斷點卻仍然想要進行值比較的用戶而言,它的做用至關重要。NSLog的使用格式與[NSString StringWithFormat]相同(以下圖所示)。

 

 

1. Xcode內置GDB,可使用GDB調試,調試命令:

        1.1 po 命令:爲 print object 的縮寫,顯示對象的文本描述

                    (lldb) po [$eax class]:輸出異常對象的地址


                    (lldb) po [$eax name]:輸出這個異常的名字
                   

                    (lldb) po [$eax reason]:這個將會輸出錯誤消息:
                   

                    (lldb)  「po $eax」:對這個對象調用「description」方法和打印出來

                    「$eax」是cup的一個寄存器。在一個異常的狀況下,這個寄存器將會包含一個異常對象的指針。注意:$eax只會在模擬器裏面工做,假如你在設備上調試,你將須要使用」$r0″寄存器

        1.2 print 命令:有點相似於格式化輸出,能夠輸出對象的不一樣信息

                    好比:print (char*)[[dic description] cString]、(lldb) print (int)[label retainCount]

        1.3 info 命令:咱們能夠查看內存地址所在信息

        1.4 info line *內存地址:能夠獲取內存地址所在的代碼行相關信息

        1.5 show 命令:顯示 GDB 相關的信息。如:show version 顯示GDB版本信息

        1.6 bt: 顯示當前進程的函數調用棧的狀況;"up num":查看調用的詳細信息;down:返回棧列表;l:顯示詳細代碼信息;p:輸出數值。

 2. 添加全局斷點(Add Exception BreakPoint):

          2.1 添加步驟:

                  1. In the bottom-left corner of the breakpoints navigator, click the Add button.
                  2. Choose Add Exception Breakpoint.
                  3. Choose the type of exception from the Exception pop-up menu.
                  4. Choose the phase of the exception handling process at which you want program execution to stop.
                  5. Click Done.

           2.2 使用場景:

                   程序由於SIGABRT而crash,想要定位到致使crash的行。

3. 添加符號斷點(Add Symbolic BreakPoint):

          3.1 斷點執行的時機:Symbolic breakpoints stop program execution when a specific function or method starts executing

          3.2 添加步驟:

                  1. Steps In the bottom-left corner of the breakpoint navigator, click the Add button.

                  2. Choose Add Symbolic Breakpoint.
                  3. Enter the symbol name in the Symbol field.
                  4. Click Done.

          3.3 使用場景:

                       當想讓系統在某個指定條件處中斷時,設置相應的斷點。

                       好比:

                              objc_exception_throw:在系統拋出異常處設置斷點。

                              -[NSException raise]:

4. 設置NSZombieEnabled、MallocStackLogging、NSAutoreleaseFreedObjectCheckEnabled、NSDebugEnabled:

         4.1 設置方法:

                1. Product->Edit Scheme...->Run...->EnvironmentVariables.
                2. add NSZombieEnabled,set the value with YES
                3. add MallocStackLogging, set the value with YES.

                4. add NSAutoreleaseFreedObjectCheckEnabled, set the value with YES.

                5. add NSDebugEnabled, set the value with YES.

         4.2 使用場景:

                主要爲了解決EXC_BAD_ACCESS問題,MallocStackLogging用來啓用malloc記錄(使用方式 malloc_history ${App_PID} ${Object_instance_addr})。

          4.3 須要注意的問題

                NSZombieEnabled只能在調試的時候使用,千萬不要忘記在產品發佈的時候去掉,由於NSZombieEnabled不會真正去釋放dealloc對象的內存。

5. 重寫respondsToSelector方法

        5.1 實現方式


[cpp] 
#ifdef _FOR_DEBUG_ 
-(BOOL) respondsToSelector:(SEL)aSelector { 
    printf("SELECTOR: %s\n", [NSStringFromSelector(aSelector) UTF8String]); 
    return [super respondsToSelector:aSelector]; 

#endif 
        5.2 使用方法:
               須要在每一個object的.m或者.mm文件中加入上面代碼(應該可使用類屬實現),而且在other c flags中加入-D _FOR_DEBUG_(記住請只在Debug Configuration下加入此標記)。這樣當你程序崩潰時,Xcode的console上就會準確地記錄了最後運行的object的方法。

參考文章:

1. Xcode GDB 調試:http://blog.csdn.net/ch_soft/article/details/7005998

2. XCode的一些調試技巧:http://blog.csdn.net/kesalin/article/details/7222153

3. About the Breakpoint Navigator:http://developer.apple.com/library/mac/#recipes/xcode_help-breakpoint_navigator/articles/about_breakpoint_navigator.html#//apple_ref/doc/uid/TP40010433-CH6-SW1

4. 當程序崩潰的時候怎麼辦 part-1:http://article.ityran.com/archives/1006

5. 當程序崩潰的時候怎麼辦 Part-2:http://article.ityran.com/archives/1143

6. Memory Usage Performance Guidelines:https://developer.apple.com/library/mac/#documentation /performance/Conceptual/ManagingMemory/ManagingMemory.html#//apple_ref/doc/uid/10000160-SW1

相關文章
相關標籤/搜索