IOSXcode調試攻略

來源:互聯網
上載者:User

  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 實現方式

  #ifdef _FOR_DEBUG_

  -(BOOL) respondsToSelector:(SEL)aSelector {

  printf("SELECTOR: %sn", [NSStringFromSelector(aSelector) UTF8String]);

  return [super respondsToSelector:aSelector];

  }

  #endif

  5.2 使用方法:

  需要在每個object的.m或者.mm檔案中加入上面代碼(應該可以使用類屬實現),並且在other c flags中加入-D _FOR_DEBUG_(記住請只在Debug Configuration下加入此標記)。這樣當你程式崩潰時,Xcode的console上就會準確地記錄了最後啟動並執行object的方法。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.