iOS調試技巧(debug)

   
說到debug,能夠說到的東西就太多了,一個程序員,即便邏輯很是出色,也會出現bug問題,那麼debug是每一個程序員必備的技巧,尤爲是Xcode開發,
蘋果公司的開發的Xcode真的是十分強大,debug能夠經過控制檯,友盟,問題的異常拋出,等不少方法找出,發現bug那麼開始咱們的debug。
   
調試技巧1、po命令
    不要說你不會po命令,假如不會,那就太菜了。
    在卡住斷點的時候能夠利用po來輸出你想看到的東西,大程哥要截圖了
圖片

圖片

    如上所述,po的含義爲print object-c的意思,爲顯示對象的文本描述,顯示對象的description
    圖片中的<nil>就是變量rowindex的值。
 
    調試技巧2、help命令
     當你忘記某條gbd命令的語法時,可使用help命令來獲取幫助信息。如:help show 顯示show命令語法。
    (gdb) help show
    Generic command for showing things about the debugger.
     
    List of show subcommands:
     
    show annotate -- Show annotation_level
    show architecture -- Show architecture of target
    show args -- Show argument list to give program being debugged when it is started
    show arm -- Various ARM-specific commands
    show auto-raise-load-levels -- Show if GDB should raise the symbol loading level on all frames found in backtraces
    show auto-solib-add -- Show autoloading of shared library symbols
    show backtrace -- Show backtrace specific variables
    show breakpoint -- Breakpoint specific settings
    show can-use-hw-watchpoints -- Show debugger's willingness to use watchpoint hardware
    show case-sensitive -- Show case sensitivity in name search 

    調試技巧3、print命令
    相似於格式化輸出
    (gdb) print (int)[str retainCount]  

    $1 = 2  程序員

    
    調試技巧4、斷點設置異常拋出
     有時候咱們的程序不知道跑到哪一個地方就 crash 了,而 crash 又很難重現。保守的作法是在系統拋出異常以前設置斷點,具體來講是在 objc_exception_throw處設置斷點。設置步驟爲:首先在 XCode 按 CMD + 6,進入斷點管理窗口;而後點擊右下方的 +,增長新的 Symbolic Breakpoint,在 Symbol 一欄輸入:objc_exception_throw,而後點擊 done,完成。 這樣在 Debug 模式下,若是程序即將拋出異常,就能在拋出異常處中斷了。好比在前面的代碼中,我讓 [firstObjctcrashTest]; 拋出異常。在 objc_exception_throw 處設置斷點以後,程序就能在該代碼處中斷了,咱們從而知道代碼在什麼地方出問題了。
     
圖片

圖片

調試技巧五、程序調試時突然崩潰,而找不到崩潰的代碼,如何解決?
 在Edit-->Scheme裏面 找到Arguments把下面3個值設置成YES
NSAutoreleaseFreedObjectCheckEnabled 
NSZombleEnabled
NSDebugEnabled 
一個很不錯的方法,建議在創建工程的時候,加入此設置  
圖片
出現 EXC_BAD_ACCESS  錯誤,給你的錯誤提示就這個,如何根本無法知道哪裏錯誤了,其實仍是有方法知道的,
作以下設置:
Project -> Edit active executable ->Argument 
添加以下四個參數
NSDebugEnabled
NSZombieEnabled
MallocStackLogging 
MallocStackLoggingNoCompact
並都設置爲YES。具體以下圖:
 圖片
 
這個時候,若是有以下一段代碼:
 //重複釋放一個變量 
  NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
  NSData* data = [NSData dataWithBytes:"asklaskdxjgr" length:12];
  [data release];
  [pool release];
再Debug窗口會有以下的提示
  圖片
 
 雖然也能大體判斷是哪一種類型的變量重複釋放了,但信息還不夠多,當項目大,源碼比較多的時候,也不太方便定位,
在console窗口運行以下命令能夠獲得更多信息:shell malloc_history <pid> <address>"
 輸入命令:shell malloc_history3939 0xa4e10
 就會出現更多的信息:
  [dave@host193 Frameworks]$ malloc_history 3939 0xa4e10
  Call [2] [arg=32]: thread_a0000dec |0x1000 | start | _start | main |
  +[NSData dataWithBytes:length:] | NSAllocateObject | object_getIndexedIvars |
  malloc_zone_calloc  
這個時候就知道具體哪一個函數出先問題了,從這裏能夠看到main裏NSData出現問題了。 
 
2. NSArray等集合類的實用問題。
      以下面的代碼    
        ReleaseTest* rt = [[alloc] init];
NSMutableArray *array = [[NSMutableArray alloc] init] ;
[array addObject: rt];
ReleaseTest *rt2 = [array objectAtIndex:0];
      [rt2 release];   
[array release];
[rt release]; 
     就會致使重複釋放內存問題,由於rt2,獲取的是一個對象的指針,若是已經釋放了的話,rt在釋放的話,就重複了,爲了遵循誰Init誰Release的原則,rt2就不該該Release。
 
3. init 和 Release 的問題。
    凡是對象經過Init的方法生成的對象,都須要本身負責Release。
    凡不是經過Init的方法生成的對象,不須要負責Release.如[NSString StringWithFormat]方法生成的對象就不須要本身Release,所以本身定義函數,返回一個類的時候,必定要設置爲autoRelease 。這樣調用的人就不用操心是否須要釋放對象了。
 4. AutoReleasePool裏最好不要將AutoRelease對象賦值給其它對象,不然離開這個做用域後,對象將會Release掉。     這是一篇簡單的debug的文章,細心的同窗可能發現,大橙哥的Xcode怎麼是5.1.1的開發環境,系統貌似也是10.9.2 一下的,本人比較懶,公司的電腦是Xcode6.1的,家裏的pro和air都沒有升級,回來就是看看書學學習什麼的,也就沒有升級,可是開發的同窗要注意了~!!!蘋果今年8月分的審覈會是大規模的,要求所有的軟件必須兼容iOS8,不然就給你產品下架,那麼說明了什麼~你的操做系統必須是最新的,Xcode必須時6.1以上的,而且最近的Xcode廢掉了一些老的sdk,還有不少新的東西,但願你們多多學習。     下面一篇debug文章我加密了,同事大哥寫的,感受太好了~!!!(真心贊~👍)想看的在qq上向我要密碼吧~ 
相關文章
相關標籤/搜索