2012-07-29 20 views
2

我遇到了很多帶有XCode最新版本的實例(我相信這是自4.2版左右發生以來的事情)堆棧在拋出異常時進行跟蹤是可悲的,缺乏細節。XCode中神祕的堆棧跟蹤不足導致錯誤發生的位置沒有上下文

在這裏的screeshot說明了一個這樣的情況;事實上,這種情況至少有一些上下文(這表明它發生在JKArray類),其中很多時候我什麼也得不到,但「內部」堆棧項(線程中只有2-3個條目,沒有一個駐留在用戶代碼或我可以看到的任何東西)。即使在這個例子中,我不知道JKArray在哪裏被分配或釋放,所以我不知道什麼是實例或問題在哪裏。

enter image description here

思考:

  • 我已經試過 「關於例外」 斷點增加一個通用
  • 沒有輸出可用一些小的信息;在這種情況下:「malloc:*對象0x10e18120錯誤:指針被釋放未分配*在malloc_error_break中設置斷點以進行調試」。雖然這樣做並沒有讓我有任何進一步的,但是,因爲斷點被擊中在同一個堆棧作爲例外...
  • 我試過切換到其他調試器
  • 我試過使用我自己的自定義異常處理程序
  • 我試過使用Profiler來查找泄漏。沒有我能找到的泄漏。

無論我做什麼,我似乎都無法隔離困擾我的應用程序的問題。此外,這些問題似乎每次都不完全一樣,這可能是由於我的應用程序中存在大量的併發問題......所以我沒有一個很好的方法來解決這些問題。


編輯:在這個特殊的例外情況下,我確實最終找到了原因。我試圖[發佈]和反對[自動發佈] d。然而,所有這些都發生在我的代碼中。我不明白爲什麼XCode不會給我一個像樣的堆棧跟蹤來幫助我找到問題,而不是強迫我通過我的整個應用程序來尋找...

+0

可以肯定的是,您是否嘗試使用NSZombie進行調試? – 2012-07-29 08:04:47

回答

1

有時候不可能找出真正的問題,因爲導致症狀的問題發生得更早。

你的問題提供了一個很好的例子:當你釋放你的對象時,可可不知道你做錯了什麼:你釋放一個你擁有的對象,這正是你應該做的,所以沒有紅旗。導致崩潰的代碼在您的方法結束後執行完畢,並將控制權交還給運行循環。正是在這一點上,運行循環開始耗盡其自動釋放池,導致第二次釋放。但是,在這一點上它所知道的是,運行循環已經導致無效的釋放,而不是你的代碼。錯誤發生的時候,罪魁禍首就是安全地離開堆棧(並且沒有掛鉤),所以Xcode沒有其他的東西可以報告給你。

像這樣的問題的解決方案是分析您的內存使用情況:分析器應該捕捉這樣的問題,並找出它們發生的地方。

毫無疑問,切換到自動引用計數將爲您節省很多內存管理部門的麻煩。

+0

公平點左右。不過,我至少期待有某種背景......但我想這並不總是可能的。去弄清楚所有困擾我的bug都是這種類型的;)也就是說,剖析器並沒有捕捉到這些問題:(ARC對於這個項目來說並不是真正的選擇 – 2012-07-29 04:10:13

+0

@ZaneClaes不幸的是,C衍生物遭受沒有「快速失敗」的例外很多:未定義的行爲通常會在很久以後出現,而且經常在真正意想不到的地方出現這種情況,我把它作爲一種代價來獲取與C/Objective C/C++,當從用戶的電池壽命中直接減去任何額外的開銷時,這是一個公平的折衷:) – dasblinkenlight 2012-07-29 04:16:43