調試技巧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上向我要密碼吧~