2015-11-22 2 views
2

У меня есть Crashlytics, установленный в приложении, и я обнаружил ошибку, которая влияет на некоторых пользователей, и я не могу ее реплицировать самостоятельно.Определение основной причины «EXC_BAD_ACCESS KERN_INVALID_ADDRESS», записанной с помощью Crashlytics

Ошибка EXC_BAD_ACCESS KERN_INVALID_ADDRESS. Я посмотрел на this post re: EXC_BAD_ACCESS, но я не могу понять, где я должен искать проблему в моем журнале сбоев.

Основываясь на следующем журнале сбоев, есть ли место, где я должен поставить точку останова для проверки нулей?

Thread 0: 

Crashed: com.apple.main-thread 
EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x00000000154d9050 
raw 

0 libobjc.A.dylib objc_msgSend + 16 
1 libAVFAudio.dylib -[AVAudioPlayer(AVAudioPlayerPriv) finishedPlaying:] + 92 
2 Foundation __NSThreadPerformPerform + 340 
3 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24 
4 CoreFoundation __CFRunLoopDoSources0 + 540 
5 CoreFoundation __CFRunLoopRun + 724 
6 CoreFoundation CFRunLoopRunSpecific + 384 
7 GraphicsServices GSEventRunModal + 180 
8 UIKit UIApplicationMain + 204 
9 My App AppDelegate.swift line 19 main 
10 libdyld.dylib start + 4 

Thread 1: com.apple.libdispatch-manager 

0 libsystem_kernel.dylib kevent_qos + 8 
1 libdispatch.dylib _dispatch_mgr_invoke + 232 
2 libdispatch.dylib _dispatch_source_invoke + 50 

Thread 2: com.twitter.crashlytics.ios.MachExceptionServer 

0 My App CLSProcess.c line 374 CLSProcessRecordAllThreads 
1 My App CLSProcess.c line 374 CLSProcessRecordAllThreads 
2 My App CLSProcess.c line 398 CLSProcessRecordAllThreads 
3 My App CLSHandler.m line 24 CLSHandler 
4 My App CLSMachException.c line 443 CLSMachExceptionServer 
5 libsystem_pthread.dylib _pthread_body + 156 
6 libsystem_pthread.dylib _pthread_body + 154 
7 libsystem_pthread.dylib thread_start + 4 

Thread 3: com.apple.NSURLConnectionLoader 

0 libsystem_kernel.dylib mach_msg_trap + 8 
1 libsystem_kernel.dylib mach_msg + 72 
2 CoreFoundation __CFRunLoopServiceMachPort + 196 
3 CoreFoundation __CFRunLoopRun + 1032 
4 CoreFoundation CFRunLoopRunSpecific + 384 
5 CFNetwork +[NSURLConnection(Loader) _resourceLoadLoop:] + 412 
6 Foundation __NSThread__start__ + 1000 
7 libsystem_pthread.dylib _pthread_body + 156 
8 libsystem_pthread.dylib _pthread_body + 154 
9 libsystem_pthread.dylib thread_start + 4 

Thread 4: com.apple.CFSocket.private 

0 libsystem_kernel.dylib __select + 8 
1 CoreFoundation __CFSocketManager + 648 
2 libsystem_pthread.dylib _pthread_body + 156 
3 libsystem_pthread.dylib _pthread_body + 154 
4 libsystem_pthread.dylib thread_start + 4 

Thread 5: com.apple.coreaudio.AQClient 

0 libsystem_kernel.dylib mach_msg_trap + 8 
1 libsystem_kernel.dylib mach_msg + 72 
2 CoreFoundation __CFRunLoopServiceMachPort + 196 
3 CoreFoundation __CFRunLoopRun + 1032 
4 CoreFoundation CFRunLoopRunSpecific + 384 
5 AudioToolbox GenericRunLoopThread::Entry(void*) + 164 
6 AudioToolbox CAPThread::Entry(CAPThread*) + 124 
7 libsystem_pthread.dylib _pthread_body + 156 
8 libsystem_pthread.dylib _pthread_body + 154 
9 libsystem_pthread.dylib thread_start + 4 

Thread 6: Thread 

0 libsystem_kernel.dylib __workq_kernreturn + 8 
1 libsystem_pthread.dylib _pthread_wqthread + 1284 
2 libsystem_pthread.dylib start_wqthread + 4 

Thread 7: Thread 

0 libsystem_kernel.dylib __workq_kernreturn + 8 
1 libsystem_pthread.dylib _pthread_wqthread + 1284 
2 libsystem_pthread.dylib start_wqthread + 4 

Thread 8: Thread 

0 libsystem_kernel.dylib __workq_kernreturn + 8 
1 libsystem_pthread.dylib _pthread_wqthread + 1284 
2 libsystem_pthread.dylib start_wqthread + 4 

Thread 9: Thread 

0 libsystem_kernel.dylib __workq_kernreturn + 8 
1 libsystem_pthread.dylib _pthread_wqthread + 1284 
2 libsystem_pthread.dylib start_wqthread + 4 

Update:

По предложению ROG, я посмотрел на метод, который вызывает AVAudioPlayer.

У меня есть класс под названием MP3Player. Он имеет два метода инициализации, которые он использует:

1) играть один файл

init(fileName: String) { 
    // Need to get location of file in bundle 
    let fileNamePath: String = NSBundle.mainBundle().pathForResource(fileName, ofType: "")! 
    // Then add the filename to the tracks array of strings 
    tracks.append(fileNamePath) 
    super.init() 
    queueTrack() 
} 

2) играть последовательность файлов

init(arrayOfMP3FileNames: NSArray) { 
    for fileName in arrayOfMP3FileNames { 
     // get the path of the file... 
     let fileNamePath: String = NSBundle.mainBundle().pathForResource(fileName as? String, ofType: "")! 
     // ...and add it to the tracks array 
     tracks.append(fileNamePath) 
    } 

    super.init() 
    queueTrack() 
} 

queueTrack метод, как представляется, содержал часть моей проблемы:

func queueTrack() { 
    // I have no idea what possessed me to put this in, but I think it's the majority 
    // of my problem 
    // ** TOOK FOLLOWING 2 LINES OUT ** 
    // if (player != nil) { 
    //  player = nil 
    // } 

    let url = NSURL.fileURLWithPath(tracks[currentTrackIndex] as String) 

    do { 
     player = try AVAudioPlayer(contentsOfURL: url) // Thread 1: breakpoint 1.1 
     player?.delegate = self 
     player?.prepareToPlay() 
    } catch let error as NSError { 
     NSLog("Unresolved error \(error.debugDescription)") 
     // SHOW ALERT OR SOMETHING 
    } 
} 

В навигаторе точки останова я добавил контрольную точку исключения для «Все исключения». Я получаю исключение в первой строке инструкции do {}, если я воспроизвожу другой звук во время воспроизведения звука. Это не сбой в симуляторе или на устройстве, но я думаю, что мне нужно его очистить, поэтому я не получаю исключения. Любые предложения по решению этой проблемы будут весьма признательны.

+1

Возможно, проблема с вашим AVAudioPlayer? В частности, 'finishedPlaying'? – Gordonium

+2

Вы случайно используете mpmovieplayercontroller? Вы должны сохранить его, используя объявление свойства. Похоже, что он снимается во время воспроизведения видео, и когда обратный вызов 'finishedPlaying:' попадает в него, вы получаете сбой. – Rog

+0

Я сейчас не на своем компьютере, но я думаю, что у меня есть экземпляр AVAudioPlayer, который воспроизводит MP3-файл. Я посмотрю, когда буду перед mlXcode и обновлен. – Adrian

ответ

3

По предложению Рога, я посмотрел, как мой класс MP3Player играл в MP3-файлы и обнаружил, что метод, вызванный из инициализаторов для класса, завершал экземпляр MP3-плеера, если он был инициализирован. Я думал, что я «очищаю», когда я изначально писал его, но фактически создавал генезис потенциального краха.

func queueTrack() { 
    // I have no idea what possessed me to put this in, but I think it's the majority 
    // of my problem 
    // ** TOOK FOLLOWING 2 LINES OUT ** 
    // if (player != nil) { 
    //  player = nil 
    // } 

    let url = NSURL.fileURLWithPath(tracks[currentTrackIndex] as String) 

    do { 
     player = try AVAudioPlayer(contentsOfURL: url) // Thread 1: breakpoint 1.1 
     player?.delegate = self 
     player?.prepareToPlay() 
    } catch let error as NSError { 
     NSLog("Unresolved error \(error.debugDescription)") 
     // SHOW ALERT OR SOMETHING 
    } 
} 
Смежные вопросы