Edited at

Containing AppとApp Extensionを同時にデバッグする

More than 1 year has passed since last update.


はじめに

Containing Appをデバッグ実行した時に

同時にApp Extensionのデバッグもする方法を纏めます。


サンプルの構成

サンプルアプリは、以下の構成とします。

Category
Target name
Description

Containing App
iOSTodayExtension
拡張元のアプリ
(開発するアプリ)

App Extension
TodayEx
Today Extension


何も考慮せずデバッグ実行する(失敗ケース)


TodayViewController.swift

extension TodayViewController: NCWidgetProviding {

func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void)) {
label.text = TodayViewData.fetchMessage()
completionHandler(NCUpdateResult.newData)
}

func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize) {
switch activeDisplayMode {
case .compact:
preferredContentSize = maxSize
case .expanded:
preferredContentSize = CGSize(width: 0, height: expandedContentHeight)
}

// iOSTodayExtension(Containing App)実行時は、以下のデバッグログはコンソールに表示されない
print("NCWidgetDisplayMode: \(activeDisplayMode)")
print("preferredContentSize: \(preferredContentSize)")
}
}


TodayEx側のコードに上記の通り、print文を書いてみたところ、

「TodayEx」を実行してwidgetの表示を増やしたり減らしたりしたところ、コンソールにログを出力できました。

また、上記TodayViewController内にブレイクポイントを設定したところ、ちゃんと停止しました。

NCWidgetDisplayMode: NCWidgetDisplayMode

preferredContentSize: (0.0, 200.0)
NCWidgetDisplayMode: NCWidgetDisplayMode
preferredContentSize: (398.0, 105.0)

しかし、「iOSTodayExtension」を実行して同様にwidgetの表示を増やしたり減らしたりしたところ、

コンソールにログが出力されませんでした。

また、ブレイクポイントを設定しても停止しませんでした。


プロセスにアタッチする

Containing AppとApp Extensionは、別のプロセスで動作するため

「iOSTodayExtension」実行時は、「TodayEx」の方はprint文の内容をコンソールに出力したり

ブレイクポイントで停止したりしていないようでした。

「iOSTodayExtension」実行後、

Debug > Attach to Process by PID or Name...

もしくは

Debug > Attach to Process

で、アタッチします。(以下のイメージは、「Attach to Process by PID or Name...」を選択した場合)

ブレイクポイントで停止するようになりました!

しかし、print文の内容は出力できておらず、これだけでは

毎回lldbのコマンドで値を出力させなければなりません。


ブレイクポイントを編集してログを出力する

print文は機能しませんでしたが、ブレイクポイントは機能するようになったので

ブレイクポイントにログを設定することでコンソールにログを出力することができます。



一番下の「Automatically continue after evaluating actions」にチェックを付けることで、

ログを出力後処理を停止しないようになります。


まとめ

Containing Appをデバッグ実行中にApp Extension側のデバッグをするには...


  1. Debug > Attach to Process by PID or Name...(もしくはDebug > Attach to Process)からApp Extensionのプロセスにアタッチする

  2. ブレイクポイントを編集して、ログを出力する