web-dev-qa-db-ja.com

アプリはリリースビルドではクラッシュするがデバッグではクラッシュしない

タイトルで言ったように、デバッグモードで完全に動作するiPhone用アプリを書いていますが、リリースとしてビルドしてTestFlight経由でインストールすると、クラッシュします。クラッシュログのため、次の行で何かを行う必要がある場合があります。

let path = NSBundle.mainBundle().pathForResource("PrinterList", ofType: "plist")
if path != nil {
    let printerDic = NSDictionary(contentsOfFile: path!)
    let printerList = NSArray(array: printerDic.allKeys)
    printerNames = printerList as [String]
}

私はブラザーのフレームワークを使用してAirPrintなしで印刷していますが、フレームワークで何かをする前にアプリがクラッシュするので、それは問題ではないと思います。これらの行を実行するこのViewControllerでのみクラッシュします。このViewControllerにもフレームワークが必要です。

30
Ben

アプリがリリースモードではクラッシュするがデバッグモードではクラッシュしない可能性がある理由はたくさんあります(たとえば、メモリ割り当ての違いにより、両方のビルドに実際に存在するバグが表示されます)。ベータコンパイラ/言語。

私が提案したようにして最適化をオフにしてリリース用にビルドすれば、問題はなくなるとあなたは言う。 Swiftコンパイラはまだベータ版であり、間違いなく時々問題があることを考えると、最適化されたビルドをビルドするとコンパイラがクラッシュするだけです。これは実際にはオプティマイザのバグである可能性があります。

したがって、今のところ、その調査は延期します。コンパイラの完全なリリースバージョンが得られるまで、最適化せずにリリースします。次に、最適化をオンに戻して、まだ問題があるかどうかを確認します。もしそうなら、それはコンパイラのバグなのか、自分のコードのバグなのかを理解するためにエネルギーを費やす時間です。

37
Matt Gibson

同じ問題がありました。 whole module optimizationaccess control の正しい実装と組み合わせると、クラッシュが修正されます。

Appleによるモジュール全体の最適化:

モジュール全体の最適化を使用して、内部宣言の最終を推測します。内部アクセスを持つ宣言(何も宣言されていない場合のデフォルト)は、宣言されているモジュール内でのみ表示されます。 Swiftは通常、モジュールを構成するファイルを個別にコンパイルするため、コンパイラは内部宣言が別のファイルでオーバーライドされているかどうかを確認できません。ただし、モジュール全体の最適化が有効になっている場合、これにより、モジュールは同時にコンパイルされます。これにより、コンパイラはモジュール全体について推論を行い、可視のオーバーライドがない場合は内部での宣言の最終を推論できます。

これはプロジェクト設定で有効にできます:

Whole Module Optimization

ただし、このオプションを使用すると、ターゲット内のすべてのファイルが一緒に最適化され、コンパイル時間が長くなりますが、パフォーマンスが向上します。

7
Antoine

クラッシュモードをキャッチするには、デバッグモードで最適化レベルを最高速、最小[-O]に設定して、生成され、ユーザーのデバイスで実行されるコードをより厳密にシミュレートします。

Swift Compiler/Code Generationの下のビルド設定で設定できます

2
Sakshi Singla

Appleは既知の issue についても説明しています。誰かが答えを探していて、以前の解決策が機能しない場合に備えて、簡単に説明します。

次のようなエラーについてクラッシュログを確認してください

Dyld Error Message:
  Library not loaded: @rpath/libswiftCore.dylib

または

[....] [deny-mmap] mapped file has no team identifier and is not a platform binary:
/private/var/mobile/Containers/Bundle/Application/5D8FB2F7-1083-4564-94B2-0CB7DC75C9D1/YourAppNameHere.app/Frameworks/libswiftCore.dylib

上記のような同様のクラッシュ出力がある場合は、Apple ガイダンス に従ってください。

PS:XCodeの[ウィンドウ]-> [デバイス]でも、簡単にログを確認できます。デバイスをクリックして、[デバイスログの表示]をクリックします。

1
flatronka