2009-07-07 37 views
50

請原諒我的無知,但是在iPhone模擬器中運行iPhone應用程序時,一直在困擾着我Xcode調試器。堆棧跟蹤或Xcode/iPhone中未處理的異常的更多信息

有時候,當我在Interface Builder中弄到一些東西時,我在運行時遇到了一個未處理的異常,我將它拋回到Xcode中。我看到的唯一一條線是「未捕獲的異常」或類似的東西。從我所看到的,沒有其他信息,更不用說堆棧跟蹤或其他任何有用的東西了。

我在過去十年左右在Visual Studio中進行了開發,我習慣於在發生類似情況時獲得一個很好的堆棧跟蹤並完成異常信息。

我敢肯定,我只是失去了一些東西很明顯...希望...

回答

70

如果添加了兩個斷點,你應該能夠調試這些異常。要做到這一點,請轉到Run |顯示|斷點並創建兩個全局斷點(我在全球範圍內執行這些斷點,因爲它們在我的所有應用程序中非常有用)。第一個應該命名爲「objc_exception_throw」,其位置應該是「libobjc.A.dylib」。第二個應該是「 - [NSException raise]」,它的位置應該是「CoreFoundation」。

現在,如果您開始調試帶有斷點的應用程序,它應該會拋出這些異常。然後,您應該能夠看到調試器中導致異常的事件鏈。

+1

對於iPhone開發,您只需要第一個。這是獲取有關發生異常的詳細信息的最佳方式。 – 2009-07-07 19:51:57

+0

是的,我認爲第二個只適用於早於Leopard的Mac OS版本。儘管如此,保持它不會受到傷害。 – 2009-07-07 20:30:55

1

你可以用你的UIApplicationMain在一個try/catch:

int main(int argc, char *argv[]) { 
    int retVal; 
    NSAutoreleasePool * pool; 
    @try 
    { 
    pool = [[NSAutoreleasePool alloc] init]; 
    retVal = UIApplicationMain(argc, argv, nil, nil); 
    } 
    @catch(NSException* e) 
    { 
     NSLog(@"%@", e.reason); 
    } 
    @finally 
    { 
    [pool release]; 
    } 
    return retVal; 
} 

你也應該看看了在調試時設置斷言處理程序:NSAssertionHandler

更新: ,也未處理的異常處理程序:NSSetUncaughtExceptionHandler

2

Hey activa - 有關運行時異常的更多信息,您應該能夠打開調試器控制檯並查看更多信息。我假設你已經這樣做了,但爲了以防萬一 - 你可以通過從菜單中選擇運行 - >控制檯來實現。我不確定它爲什麼不會自動出現!

3

缺少堆棧跟蹤是通常是指示LLDB(調試器)出現問題。我喜歡LLDB,但是當涉及到顯示堆棧跟蹤和突破iOS應用程序中的異常而非主要問題時,這是一個痛苦的屁股,現在已經有幾個版本。不知道爲什麼蘋果還沒有解決這個問題呢。修復它是一個兩步過程:

  1. 編輯您當前的計劃,並在「運行」選項卡下將調試器從LLDB更改爲GDB。
  2. 轉到https://developer.apple.com/bugreporter/並報告錯誤,以便Apple解決它。