Xcode崩潰問題調試 signal SIGABRT&EXC_BAD_ACCESS


在進行app開發過程中會遇到很多的問題,各種崩潰令人相當頭疼。當然,解決bug的能力也體現了一個程序員的水平,現在來說一說開發中經常遇到的崩潰問題吧。

常見崩潰問題: 一是signal SIGABRT, 二是EXC_BAD_ACCESS.

一、signal SIGABRT 出現這樣的崩潰一般有兩個原因:1. 數組越界 

輸入:

  
    NSArray *array = [NSArray arrayWithObject:@"0"];
    
    NSString *str = [array objectAtIndex:1];
    
    NSLog(@"%@",str);

運行崩潰:

打印的崩潰信息:

Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]',很明顯給出的崩潰信息是數組越界,此時要仔細檢查程序中的數組問題

  2.調用的方法不存在:

輸入:

[self performSelector:@selector(haha)];

運行崩潰,崩潰信息:

unrecognized selector sent to instance 0x7fcd584a1ae0

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[ViewController haha]: unrecognized selector sent to instance 0x7fcd584a1ae0'

說明該方法並不存在,所以造成崩潰

二、EXC_BAD_ACCESS一般是內存訪問出錯,對象內存已經釋放,但仍然在訪問會造成這樣的后果

舉個例子,在進行視頻截圖時,

generator是圖片資源生成器
[generator generateCGImagesAsynchronouslyForTimes:@[currentSnipTime] completionHandler:^(CMTime requestedTime, CGImageRef  _Nullable image, CMTime actualTime, AVAssetImageGeneratorResult result, NSError * _Nullable error) {
        
        NSLog(@"生成完成");
        //主線程更新UI  如果是異步任務 : 在當前線程中繼續執行,而不會等待該代碼塊執行完畢,也就是跳過了賦值的代碼,造成野指針
        dispatch_sync(dispatch_get_main_queue(), ^{
            //EXC_BAD_ACCESS 野指針  訪問不能使用的內存地址
            self.snipImageView.image = [UIImage imageWithCGImage:image];
        });
    }];

所以當崩潰信息中出現了EXC_BAD_ACCESS這樣的信息,可以分析哪些屬性用weak修飾,或者線程異步/同步問題。當然我們還可以借助Xcode工具 點擊Xcode的菜單:Product->Profile,啟動Instruments 在Instruments模板中選擇Zombies,它能把已釋放的內存暫時保留,再次訪問時會報告錯誤,並給出該塊內存曾經的一些使用信息,幫助我們快速定位。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM