posts - 9,  comments - 0,  trackbacks - 0

          1: 為工程運行時加入 NSZombieEnabled 環境變量,并設為啟用,則在 EXC_BAD_ACCESS 發生時,XCode 的 Console 會打印出問題描述。

          首先雙擊 XCode 工程中,Executables 下的 可執行模組,


          在彈出窗口中,Variables to be set in the environment,添加 NSZombieEnabled,并設定為 YES,點擊選中復選框啟用此變量。

          這樣,運行 Objective-C 時會看到控制臺輸出錯誤信息

          這條消息對于定位問題有很好的提示作用。但是很多時候,只有這條提示是不夠的,我們需要更多的提示來幫助定位問題,這時候再加入 MallocStackLogging 來啟用malloc記錄。

          當錯誤發生后,在終端執行:

          malloc_history ${App_PID} ${Object_instance_addr}

              則會獲得相應的 malloc 歷史記錄,比如對于上一個控制臺輸出

          Untitled[3646:a0f] *** -[CFString release]: message sent to deallocated instance 0x10010d340

              則我們可以在終端執行,結果如下:

          Buick-Wongs-MacBook-Pro:Downloads buick$ malloc_history 3646 0x10010d340
          malloc_history Report Version: 2.0
          Process: Untitled [3646]
          Path: /Users/buick/Desktop/Untitled/build/Debug/Untitled
          Load Address: 0×100000000
          Identifier: Untitled
          Version: ??? (???)
          Code Type: X86-64 (Native)
          Parent Process: gdb-i386-apple-darwin [3638]

          Date/Time: 2011-02-01 15:07:04.181 +0800
          OS Version: Mac OS X 10.6.6 (10J567)
          Report Version: 6

          ALLOC 0x10010d340-0x10010d357 [size=24]: thread_7fff70118ca0 |start | main | objc_msgSend | lookUpMethod | prepareForMethodLookup | _class_initialize | +[NSString initialize] | objc_msgSend | lookUpMethod | prepareForMethodLookup | _class_initialize | NXCreateMapTableFromZone | malloc_zone_malloc
          —-
          FREE 0x10010d340-0x10010d357 [size=24]: thread_7fff70118ca0 |start | main | objc_msgSend | lookUpMethod | prepareForMethodLookup | _class_initialize | _finishInitializing | free

          ALLOC 0x10010d340-0x10010d357 [size=24]: thread_7fff70118ca0 |start | main | -[NSPlaceholderString initWithString:] | objc_msgSend | lookUpMethod | prepareForMethodLookup | _class_initialize | _class_initialize | +[NSMutableString initialize] | objc_msgSend | lookUpMethod | prepareForMethodLookup | _class_initialize | NXCreateMapTableFromZone | malloc_zone_malloc
          —-
          FREE 0x10010d340-0x10010d357 [size=24]: thread_7fff70118ca0 |start | main | -[NSPlaceholderString initWithString:] | objc_msgSend | lookUpMethod | prepareForMethodLookup | _class_initialize | _class_initialize | _finishInitializing | free

          ALLOC 0x10010d340-0x10010d35f [size=32]: thread_7fff70118ca0 |start | main | -[NSCFString substringWithRange:] | CFStringCreateWithSubstring | __CFStringCreateImmutableFunnel3 | _CFRuntimeCreateInstance | malloc_zone_malloc

              這樣就可以很快的定位出問題的代碼片段了,注意輸出的最后一行,,,這行雖然不是問題的最終原因,但是離問題點已經很近了,隨著它找下去,八成就會找到問題。

          posted on 2011-02-21 09:51 閱讀(377) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2011年2月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272812345
          6789101112

          常用鏈接

          留言簿(1)

          隨筆檔案

          文章分類

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 汉沽区| 庆元县| 尉氏县| 新巴尔虎左旗| 珲春市| 呼和浩特市| 漳州市| 霍林郭勒市| 通城县| 河间市| 自治县| 莫力| 保德县| 永年县| 沅陵县| 水城县| 阳泉市| 乌兰察布市| 陇南市| 尖扎县| 嘉定区| 涞水县| 商洛市| 济南市| 宁都县| 襄汾县| 井陉县| 石屏县| 东莞市| 南城县| 西城区| 仙桃市| 吉林省| 萨迦县| 兰溪市| 图木舒克市| 乐昌市| 乌拉特前旗| 湖北省| 吴旗县| 五台县|