Crashlytics iOS - Сбой в строке 0 - источники Swift - PullRequest
0 голосов
/ 20 декабря 2018

В настоящее время я сталкиваюсь с проблемой с некоторыми исходными файлами Swift, когда происходит сбой.Действительно, на Crashlytics у меня есть странная информация о линии и причине аварии.Это говорит мне, что источник произошел сбой в строке 0 , и это дает мне ошибку SIGTRAP .Я прочитал, что эта ошибка возникает, когда поток попадает в точку останова.Но проблема в том, что эта ошибка возникает, когда я не отлаживаюсь (тест приложения из TestFlight).

Вот пример, когда Crashlytics сообщает мне, что в строке 0 есть ошибка SIGTRAP:

// Method that crashs  
private func extractSubDataFrom(writeBuffer: inout Data, chunkSize: Int) -> Data? {  

        guard chunkSize > 0 else { // Prevent from having a 0 division  
            return nil  
        }  

        // Get nb of chunks to write (then the number of bytes from it)  
        let nbOfChunksToWrite: Int = Int(floor(Double(writeBuffer.count) / Double(chunkSize)))  
        let dataCountToWrite = max(0, nbOfChunksToWrite * chunkSize)  
        guard dataCountToWrite > 0 else {  
            return nil // Not enough data to write for now  
        }  

        // Extract data  
        let subData = writeBuffer.extractSubDataWith(range: 0..<dataCountToWrite)  
        return subData    
}  

Еще один файл Swift для объяснения того, что происходит в строке "writeBuffer.extractSubDataWith (range: 0 ..

public extension Data {  

    //MARK: - Public  
    public mutating func extractSubDataWith(range: Range) -> Data? {  

        guard range.lowerBound >= 0 && range.upperBound <= self.count else {  
            return nil  
        }  

        // Get a copy of data and remove them from self  
        let subData = self.subdata(in: range)  
        self.removeSubrange(range)  

        return subData  
    }  
}  

Не могли бы вы сказать мне, что я делаю неправильно?странная ошибка SIGTRAP?

Спасибо

1 Ответ

0 голосов
/ 22 декабря 2018

Сбой с нулевой линией действительно странно.Но часто встречается в коде Swift.

Компилятор Swift может выполнять генерацию кода от вашего имени.Это может случиться довольно часто с общими функциями, но может случиться и по другим причинам.Когда компилятор генерирует код, он также создает отладочную информацию для кода, который он генерирует.Эта отладочная информация обычно ссылается на файл, который вызвал генерацию кода.Но компилятор помечает все это строкой 0, чтобы отличить ее от кода, который был фактически написан разработчиком.

Эти универсальные функции также не должны быть написаны вами - я виделэто случается и со стандартными библиотечными функциями.

(Кроме того: я считаю, что стандарт DWARF, на самом деле, может описать эту ситуацию более точно. Но, к сожалению, Apple, похоже, не использует его таким образом.)

Apple проверила поведение линии на нуле с помощью радара, который я подал об этом несколько лет назад.Вы также можете просмотреть собственные данные отладки вашего приложения (например, через dwarfdump), если хотите подтвердить.

Одна из причин, по которой вы можете попытаться сделать это, - это если вы действительно не доверяете этому.Crashlytics правильно маркирует линии.Между их пользовательским интерфейсом и необработанными данными о сбоях много всего.Возможно, что-то пошло не так.Единственный способ подтвердить это - захватить аварийный адрес + двоичный файл и выполнить поиск самостоятельно.Если dwarfdump скажет вам, что это произошло в нулевой строке, то это подтверждает, что это просто артефакт генерации кода во время компиляции.

Однако я склонен полагать, что с пользовательским интерфейсом Crashlytics все в порядке.Я просто хотел указать на это как на возможность.

Что касается SIGTRAP - в этом нет ничего странного.Это всего лишь указание на то, что выполняемый код решил прекратить процесс.Это отличается, например, от SIGBUS, где ОС завершает работу.Это может быть вызвано проверкой целочисленных значений и / или границ диапазона Swift.В вашем коде есть что-то подобное в обоих местах.И, поскольку это было бы очень критично для производительности, было бы главным кандидатом для генерации встроенного кода.

Обновление

Теперь кажется, что, по крайней мере, в некоторых ситуацияхтеперь компилятор также использует имя файла <compiler-generated>.Я уверен, что они сделали это, чтобы прояснить этот случай.Так что, возможно, с более свежими версиями Swift вы увидите <compiler-generated>:0.Это может не помочь отследить сбой, но как минимум сделает вещи более очевидными.

...