質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

2473閲覧

実機ビルドした際のクラッシュに対する解決法

tom0708

総合スコア7

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2020/02/15 15:47

編集2020/02/16 01:30
  1. 質問の概要

現在作成中の個人アプリを実機でビルドして、デバッグしていたところ、ログイン画面から、タブバーに画面遷移する際にアプリがクラッシュしました。
デバッグエリアには、ログが表示されていますが、エラーログと判断できるものもなく、調べても解決に至りませんでしたので、質問させて頂きました。

  1. 前提となる情報

今回クラッシュした箇所は実機(IPhoneX)を最新版にアップデートする前は、クラッシュしていなかった。今回クラッシュする前はスプラッシュ画面の段階でクラッシュしていたこともあったが、GeneralのFrameworks,Libraries,and Embeded Contentにframeworkを追加することで解消された経緯があります。キャッシュの削除や再起動などは試しました。
参考にした記事- https://qiita.com/mono0926/items/bf70c7ef15db046ee163
https://lab.sonicmoov.com/development/iphone-app-dev/iphone-debug/
登録画面コード: 以下

class RegistrationViewController: UIViewController,UITextFieldDelegate{ var array = [String]() @IBOutlet var babyName: UITextField! @IBOutlet var sex: UISegmentedControl! @IBOutlet var birthdarButton: UIButton! @IBOutlet var addButton: UIButton! var textField = “” var sexSelect = UIImage() var birthday = Date() var birthdayLabel1 = “” let defaults = UserDefaults.standard override func viewDidLoad() { super.viewDidLoad() babyName.delegate = self } @IBAction func sexSelect(_ sender: UISegmentedControl) { switch sex.selectedSegmentIndex{ case 0: sexSelect = UIImage(named: “babys”)! let data = sexSelect.pngData() defaults.set(data, forKey: “image”) case 1: sexSelect = UIImage(named: “girl”)! let data = sexSelect.pngData() defaults.set(data, forKey: “image”) case 2: sexSelect = UIImage(named: “cherry”)! let data = sexSelect.pngData() defaults.set(data, forKey: “image”) default: print(“error”) } } @IBAction func birthdayButton(_ sender: Any) } override func prepare(for segue: UIStoryboardSegue, sender: Any?) if segue.identifier == “tabBar” { if let tabVC = segue.destination as? UITabBarController, let navVC = tabVC.viewControllers?.first as? UINavigationController, let destVC = navVC.viewControllers.first as? RecordViewController { destVC.name = self.babyName.text! destVC.babyImageView = self.sexSelect destVC.birthdayLabel2 = birthdayLabel1 } } } @IBAction func add(_ sender: Any) {  ←ここをタップするとクラッシュ self.performSegue(withIdentifier: “tabBar”, sender: self) textField = babyName.text! //入力した名前を保存 defaults.set(babyName.text, forKey: “Name”) } //キーボード閉じる func textFieldShouldReturn(_ textField: UITextField) -> Bool { babyName.resignFirstResponder() return true } }
  1. 期待する挙動

登録画面から、タブバーへ画面遷移させたい。

  1. 発生したエラーや意図しない挙動の説明

エラー文: Thread 1: signal SIGABRT
デバッグエリアに表示されているログ:

2020-02-15 00:31:03.119956+0900 ParentingApp12[1723:116776] <UIView: 0x105707180; frame = (0 0; 375 812); autoresize = W+H; layer = <CALayer: 0x283075080>>’s window is not equal to <ParentingApp12.TabBarController: 0x108037800>’s view’s window!
  1. デバッグ内容と自身の考察

ブレークポイント設定により、デバッグを実施しましたが、クラッシュ時に原因箇所で止まらず、「class AppDelegate: UIResponder, UIApplicationDelegate」の部分に「Thread 1: signal SIGABRT」とエラーが出ます。画面遷移を設定している
@IBAction funcメソッドあたりに問題があると思い調べているのですが、Identifierの設定などにも問題はなく、クラッシュログの解析というものがあると知り、WindowのDeviceから実機のクラッシュログを表示させるところまでは、できたのですが、解析には至らず、解決につながる記事にたどり着けていません。今回の事象について何が原因となり得るのか分かっていないため、何かアドバイスを頂けないでしょうか。

  1. 求める回答

Thread 1: signal SIGABRTやデバッグエリアにエラーログが表示されずにクラッシュした場合の対処方法について
Generalなどの設定を誤っていじってしまった場合に、クラッシュする原因となり得るのか

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tom0708

2020/02/15 17:45 編集

両方設定しておりましたので、コードを削除してみましたがクラッシュしてしまいます。 ちなみデバッグエリアのログは消えました。 エラー文のないクラッシュはよくあるものなのでしょうか。
hoshi-takanori

2020/02/15 20:33

あとはこのソースだけではなんとも言えないですね。 ところで、「最新版にアップデートする前は、クラッシュしていなかった」とのことですが、アップデート前の iOS のバージョンは分かりますか? また、遷移の方法(セグエの種類)と遷移作の画面(RecordViewController)のソースも見てみたいです。(できればソース全体をどこかに上げていただくのが一番ですが。)
tom0708

2020/02/16 00:28

ありがとうございます。 はい、最新版の一つ前なので13.2だったと思います! 遷移方法はstoryboard上で実施しております。(identifier”tabBar”) こちらがGithubのURLです、https://github.com/sakishu/ParentingApp12 お願い致します!
TakeOne

2020/02/16 00:47

質問がよくわかりませんでした。 「デバッグエリアには、エラーログと判断できるものもなく」と書かれてあるのに「デバッグエリアに表示されているログ」が提示されているし、「今回クラッシュする前はスプラッシュ画面の段階でクラッシュしていたが、GeneralのFrameworks,Libraries,and Embeded Contentにframeworkを追加することで解消された。」と書かれていることからクラッシュは既に解消されているようにも見えます。 「e.g.」というのは、通常は質問テンプレートの「記入例」を意味するのですが、もしかして質問テンプレートの記入例をそのまま残した上で自分の状況を追記しているのでしょうか? もしそうであれば、記入例の部分は削除して、自分の状況だけ示すようにしてください。
tom0708

2020/02/16 01:19 編集

わかりづらくて失礼しました。参考情報として過去の状況を載せたかったのですが、以後気をつけます。 記入例は使用しましたが、マークダウンなどの知識も浅く、誤解を与えてしまう記入になってしまいました、ですがこれは全て私の状況です。
hoshi-takanori

2020/02/16 02:48

動かしてみました。起動画面がかわいいですね! ってのはさておき、落ちる条件をひとつ見つけました。アプリをいったん消して、性別を選ばずに登録すると RecordViewController の viewWillAppear メソッドで落ちますね。でも、落ちた場所がちゃんと表示されるので、他にも条件があるのでしょうか。
tom0708

2020/02/16 03:09

嬉しいです、ありがとうございます! それは気付きませんでしたので修正します! すいません、条件とはどういう意味でしょうか。 私のほうで確認した際には、名前、性別、生年月日を入力して、「登録」ボタンをタップしてところで、クラッシュします。
tom0708

2020/02/16 03:17 編集

実機で性別を選ばずに登録してみたところ、クラッシュしましたが、ログは何も表示されませんでした。シミュレーターで、何も選択せずに登録して見たところクラッシュしました。ちなみに誤操作によってログが表示されなくなるということはあるのでしょうか?
hoshi-takanori

2020/02/16 03:16

言葉足らずでした。落ちる条件のことです。私の iPhone X (iOS 13.3.1) では、性別を選べば落ちないので。
tom0708

2020/02/16 03:20

とんでもありません。他には落ちる条件は特にありません。やはり、バージョンアップが原因と考えられるのでしょうか。
hoshi-takanori

2020/02/16 04:02

「私の iPhone X (iOS 13.3.1) では、性別を選べば落ちない」と書きましたので、バージョンアップが原因とは考えにくいのですが…。ところで、「ログイン画面」とおっしゃってるのは赤ちゃん未登録の状態で起動した時の登録画面でしょうか? または、設定 → 編集 を選択した時の画面でしょうか?
tom0708

2020/02/16 04:10

勘違いしました、すいません! 起動画面は登録画面のことです。
hoshi-takanori

2020/02/16 04:23

起動時に登録画面に遷移し、名前、性別、生年月日を入力して、「登録」ボタンを押すとクラッシュするんですね。その後、アプリを起動し直した時、登録画面に進みますか? それとも、登録済みの状態で起動しますか?
tom0708

2020/02/16 04:41

そうです!再度起動し直すと、スプラッシュ画面で落ちます。
hoshi-takanori

2020/02/16 05:43

なるほど。それでは、タブバー管理下の各画面の viewDidLoad に適宜 print 文を入れて、どこで落ちるかを探るといいのでは。
tom0708

2020/02/17 03:46

Macが起動しなくなってしまい、返信遅れました! もう少し試行錯誤して見ます。
tom0708

2020/02/17 16:04

printで確認したところ、登録ボタンタップした際に、viewdidloadの値が取れていませんでした。ということは、画面遷移時に呼ばれるoverride func prepare内に記載している部分を疑うという考えで良いのでしょうか。 また、デバイスログも確認しましたが、初心者ですが、私が見た限り具体的なクラッシュに関する原因が記載されていないように思いました。 デバイスログにおけるクラッシュ原因の見極め方は、自分の書いたメソッド名などを探して推測する、というような感じで良いのでしょうか。
guest

回答1

0

ベストアンサー

「前提となる情報」に書かれていることは「前提(ある物事が成り立つためにあらかじめ満たされていなければならない条件)」ではなく、過去に遭遇し、解決したことのある経験を参考情報として記述しただけだと理解しました。

そして、一番困っているのは、エラーログが表示されずにクラッシュしてしまうため原因を調べる方法がわからないということだと理解しました。そこで気になったことをアドバイスしておきます。

おそらく、
https://qiita.com/mono0926/items/bf70c7ef15db046ee163
の記事を参考にして、Exception Breakpointを設定しているのではないでしょうか?

以下、Exception Breakpointを設定しているものと推測して説明しておきます。

Exception Breakpointは、エラーが発生した時点で実行を止めるのでエラー発生箇所が分かりやすくなるというメリットがありますが、それによりエラーの後処理(エラーメッセージをコンソールに出力する処理)も止まってしまい、コンソールに何もエラーメッセージが出ないという事態になります。そして、実行が止まった場所が自分が作ったところ以外の部分であれば、結局意味のわからないところで止まるだけで、エラーの原因は何もわからないという事態になります。この場合は、エラー発生場所よりもエラー原因が書かれたエラーメッセージの方が重要な情報になります。

上記の参考記事では、Exception Breakpointを設定した上で、エラーメッセージもちゃんと表示する方法として、Exception BreakpointのActionをDebugger Commandにして、「po $arg1」を実行コマンドに設定するよう説明されています。

Exception Breakpointを使っているなら、それが正しく設定されているか確認してみてください。

もし、それを正しく記述しているはずなのにエラーメッセージが何も出ないなら、エラーで止まっている状態でデバッガのcontinueボタンを何度か押してください。そうすることでエラーの後処理が行われ、エラーメッセージが表示されるはずです。

それでもエラーが表示されないなら、Exception Breakpointの設定を削除して実行してみた方がよいかもしれません。

Exception Breakpointを設定してエラー発生場所を特定してもエラー原因が特定できない場合は、そのようにして何とかエラーメッセージを表示させ、エラーメッセージからエラー原因を調べていくことをお勧めします。

投稿2020/02/17 15:51

TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tom0708

2020/02/18 02:55

ありがとうございます、御教示頂いた通り実施したところ、エラーメッセージが表示されました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問