Сбой OS X: освобожденный указатель не выделен - PullRequest
0 голосов
/ 10 декабря 2018

Нужна помощь, чтобы понять реальную причину сбоя.Я сделал приложение, которое должно работать 24/7.Он считывает и подготавливает некоторые данные с оборудования и создает веб-сервер для отправки данных на зонд.Авария происходит через разное время, поэтому я не могу воспроизвести ее в симуляторе.

Вот последние сведения о файле аварии:

Time Awake Since Boot:110000 секунд

Защита целостности системы: включено

Сбой потока: 37 Очередь отправки: com.apple.root.default-qos

Тип исключения: EXC_CRASH (SIGABRT)

Коды исключений: 0x0000000000000000, 0x0000000000000000

Примечание об исключении: EXC_CORPSE_NOTIFY

Достигнуто мягкое ограничение потока отправки: 64 (слишком много потоков отправки заблокировано в синхронных операциях)

ПриложениеСпециальная информация: abort () вызвал

*** ошибка для объекта 0x247032000: освобожденный указатель не был выделен

Подробности для потока 37:

Поток 37 Crashed :: Очередь отправки: com.apple.root.default-qos

0 libsystem_c.dylib 0x00007fff8dab3298 usleep $ NOCANCEL + 0

1 libsystem_c.dylib 0x00007fff8dae16e9 abort+ 139

2 libsystem_malloc.dylib 0x00007fff965fe041 бесплатно + 425

3 libswiftCore.dylib 0x0000000106fed219 $ Ss19_SwiftStringStorageCfD + 9

*1006*

...

46 org.cocoapods.GCDWebServer 0x0000000106c67316 - Процесс [GCDWebServerConnection (Subclassing )Request: завершение:] + 128

47 org.cocoapods.06x0000000[GCDWebServerConnection _startProcessingRequest] + 146

48 org.cocoapods.GCDWebServer 0x0000000106c64e13 __45- [GCDWebServerConnection _readRequestHeaders] _block_invoke + 1781

49 org.cocoapods.GCDWebServer 0x0000000106c65935 __64- [GCDWebServerConnection (Read) readHeaders:withCompletionBlock:] _ block_invoke + 290

50 org.cocoapods.GCDWebServer 0x0000000106c65613 __68- [GCDWebServerConnection (чтение) readData: withLength: завершениеBlock:] _ _b__invoke_505 * 303 * 053а8 __dispatch_read_block_invoke_252 + 39

* * 52 1 055 libdispatch.dylib 0x00007fff8e72a93d _dispatch_call_block_and_release + 12

53 libdispatch.dylib 0x00007fff8e71f40b _dispatch_client_callout + 8 * +1058 *

54 libdispatch.dylib 0x00007fff8e72329b _dispatch_root_queue_drain + 1890

55 libdispatch.dylib 0x00007fff8e722b00 _dispatch_worker_thread3 + 91

56 libsystem_pthread.dylib 0x00007fff8ea934de _pthread_wqththread1069 *

Это код синглета, который обрабатывает веб-сервер (GCDWebServer).Он считывает сохраненные в памяти данные в соответствии с идентификатором в запросе http

private let queue = DispatchQueue(label: "gcdwebserver_queue")

private func setupServer(){

    webServer.delegate = self
    webServer.addDefaultHandler(forMethod: "GET", request: GCDWebServerRequest.self) { (req, completion) in

        if let resp = self.response(for: req) {
            return completion(resp)
        }
    }

    queue.async {
        self.webServer.start(withPort: 8521, bonjourName: "GCD Web Server")            
    }

}

А вот код синглтона, который вызывает соединение Modbus (библиотека C Modbus) (каждые 30 секунд) со списком устройстви читает данные:

private let modbusQueue = DispatchQueue(label: "modbus_queue")
private func initiateTimer() {
    polling()

    timer?.invalidate()
    if #available(OSX 10.12, *) {
        timer = Timer.scheduledTimer(withTimeInterval: pollingInterval, repeats: true) { (_) in
            self.polling()
        }
    } else {
        timer = Timer.scheduledTimer(timeInterval: pollingInterval, target: self, selector: #selector(polling), userInfo: nil, repeats: true)
    }
}

@objc private func polling() {

    for device in self.devices {

        if !device.isInProcess && device.isEnabled {
            self.modbusQueue.async {
                self.connectAndReadValues(device: device)
            }
        }

    }
}

private func connectAndReadValues(device: Device) {

    device.isInProcess = true

    let connect = device.modbus.connect()
    //handling connection status
    //...

    readValues(forDevice: device)
}

private func readValues(forDevice device: Device){
    //some constants

    do {

        let registers = try device.modbus.readRegisters(from: startAddress, count: registersCount)
        device.readState = .success
        device.modbus.close()
        //parse and save data to the app memory just as a dictionary. It saves only one small dictionary per device
        parseRegisters(controllerIP: device.modbus.host, vendor: vendor, registers: registers, startAdd: startAddress)
    } catch let error {
        //handling errors
    }

    //refreshing interface in the main queue
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...