Поток 1: EXC_BAD_INSTRUCTION (код=EXC_I386_INVOP, подкод=0x0) Swift на macOS appp

#ios #swift #macos

Вопрос:

В следующей строке есть функция, которую я вызываю из другого файла.

 import Cocoa

class ViewController: NSViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
     
        var result = myFunc()
        
        
       
        // Do any additional setup after loading the view.
    }

 

Функция работает успешно, но когда она заканчивается, я получаю такой результат.

В AppDelegate @основной поток 1: EXC_BAD_INSTRUCTION (код=EXC_I386_INVOP, подкод=0x0)

Фрагмент кода, вызвавший сбой:

                 do {
                    try FileManager.default.createDirectory(at: textureURL.deletingLastPathComponent(), withIntermediateDirectories: true)
                } catch {
                    print("Couldn't create output directory")
                    print(error)
                    return false
                }

                guard let texture = textureSampler.texture else {
                    continue
                }

                let cgImage = texture.imageFromTexture()!.takeRetainedValue()
                let nsBitmap = NSBitmapImageRep(cgImage: cgImage)

                var imageType: NSBitmapImageRep.FileType
                let textureType = textureURL.pathExtension.lowercased()

                switch(textureType) {
                    case "png":
                        imageType = .png
                    case "jpg", "jpeg":
                        imageType = .jpeg
                    default:
                        print("Unknown texture type "(textureType)" of texture (textureURL.lastPathComponent)")
                        imageType = .png
                }

                if convertToPNG {
                    // override automatic selection here
                    imageType = .png
                    textureURL = textureURL.deletingPathExtension().appendingPathExtension("png")
                }

                let imageData = nsBitmap.representation(using: imageType, properties: [
                    NSBitmapImageRep.PropertyKey.compressionFactor: NSNumber(floatLiteral: 1.0)
                ])!

                do {
                    try imageData.write(to: textureURL)
                    alreadySaved.append(textureURL)
                } catch {
                    print("Couldn't save (textureURL.lastPathComponent)")
                    return false
                }
 

Комментарии:

1. Я не верю, что вы сможете получить полезный ответ, не поделившись кодом myFunc.

2. Поделитесь myFunc() на всякий случай. Кроме того, не могли бы вы поделиться с нами содержанием вывода консоли? Там может быть какая-то полезная информация…

3. Интересно то, что когда я запускаю эту функцию одну за другой, она не выдает ошибку, но всякий раз, когда этот код завершает работу, приложение выходит из строя.

4. Вероятно, это означает, что, как только он завершится, ваш код попытается получить доступ к чему-то, что с тех пор было освобождено из памяти. Проверьте, не сохраняете ли вы себя в закрытии или что-то в этом роде. Также переместите объявление переменной «результат» из viewDidLoad в свойство в корне класса.

5. Здесь много силовых разверток, без вас довольно сложно сузить круг проблем: урезать пример до его сути, 2: предоставить гораздо больше подробностей об ошибке (сообщение об ошибке, строка, на которой она находится, обратный путь).

Ответ №1:

Я нашел решение; в документации по песочнице apple

Если приложение выходит из строя при попытке его запуска, в частности, при получении сигнала EXC_BAD_INSTRUCTION, наиболее вероятной причиной является то, что ранее вы запускали изолированное приложение с тем же идентификатором пакета, но другой подписью кода. Этот сбой при запуске является функцией безопасности песочницы приложения, которая предотвращает маскировку одного приложения под другое и тем самым получение доступа к контейнеру другого приложения.

А затем измените эту строку

 let cgImage = texture.imageFromTexture()!.takeRetainedValue()
 

как показано ниже

 let cgImage = texture.imageFromTexture()!.takeUnretainedValue()