NSLogでiOS 8拡張機能をデバッグする方法は?


90
- (void)viewDidLoad
{
    NSLog(@"%s", __func__);
    // ...
}

viewDidLoadのiOS 8の延長NSLogXcodeでの出力は何もありません。NSLogコンテナアプリでも通常どおり機能します。

拡張機能からデバッグメッセージから出力を取得するにはどうすればよいですか?


私にもこの問題があります。NSLogが壊れているだけかもしれません。現在、ブレークポイントを使用して値をデバッグしています。しかし、彼らも本当にバギーです。
ガリレオ2014年

Xcodeでデバッガーがラッチせず、常に「接続を待機しています」と表示する同様の問題があります。残念ながら、グーグルでの使用は何も見当たらず、スタックに質問を投稿しましたが、まだ回答はありません。
Alex Bollbach 16

回答:


95
  1. デバッグはアプリ拡張機能で機能します。
  2. シミュレータでも動作します。
  3. アプリextがシミュレーターでクラッシュした場合、アプリextを再起動するのが容易ではない場合があります。シミュレーターを再起動することは簡単な解決策です。
  4. アプリ拡張機能をデバッグする手順:

    1. コンテナーアプリを実行します。このステップでは、Xcodeがコンテナーアプリとアプリ拡張機能をデバイスまたはシミュレーターにアップロードします。

    2. コンテナーアプリを停止します。このステップは、シミュレーターでデバッグするときに重要です。そうしないと、シミュレーターが使用中であることがXcodeから通知されます。

    3. Xcodeで、[Debug]-> [Attach to Process]-> [By Process Identifer(PID)or Name ...]メニューを押し、アプリの拡張の識別子(例:com.abc.ContainerApp.MyExtension)を入力してデバッグを開始します。ブレークポイントを設定することを忘れないでください。(2014年8月25日更新:MyExtension(あなたの拡張機能の名前)を直接入力できます。)

    4. デバイスまたはシミュレーターで、アプリ拡張機能を開きます。


2014年8月23日の更新:

上記のデバッグ手順は、シミュレータのiOS 8 SDKベータ5を使用するXcode 6ベータ6ではうまく機能しないことがわかりました。

解決:

  1. シミュレーターで拡張機能を実行します。
  2. XcodeメニューDebug-> Attach to Process->メニューのSystemセクションで「MyExtension(your extension's name)」を選択します。

ブレークポイントは機能します。しかし、ログが出力ウィンドウに表示されない理由はわかりません。


8
これまでのところ、デバッグ(およびNSLogを参照)する最も簡単な方法は、次の手順に従うことです。/// 1 ///コンテナーアプリスキーマを選択して実行します。/// 2 ///起動して実行中-XCodeに切り替え、([停止]ボタンを押さなくても)拡張スキーマを選択してから、[実行]ボタンを押します。/// 3 ///実行するアプリの選択を求められたら、[今日]を選択します。/// 4 ///これで、ブレークポイントとNSLogは問題なく動作するはずです。
割り込み

1
これは今日、特にクラッシュ後も機能しません。これは非常に迷惑です、なぜ修正が難しいのか分かりません。
Cristi Băluță 2014

3
上記の更新された手順を使用してみましたが、うまくいきました。ただし、ステップ2では、拡張名を使用する代わりに、「プロセスID(PID)または名前...」を使用して、プロセスのPIDを入力しました。これにより、魔法のようにブレークポイントを使用できました。
tony.tc.leung 2015年

デバッグ> PIDまたは名前でプロセスにアタッチ:テキストフィールドに、デバッグナビゲーターにプロセス名を入力します。たとえば、com.company.AppName.AppName-ExtensionName
TigerCoding

この回答は質問には関係ありません。OPは、NSLogメッセージが拡張機能でコンソールに書き込まれない理由を尋ねています(同じ質問でこのページにアクセスしたときの正当な懸念)。デバッガーへの接続に関する問題については何も述べられていません。
Joey Carson、

49

私もこの問題を抱えています。シミュレータのメニューDebug-> Open System Log ...に行くとうまくいきます。

ここから、iPhoneシミュレーターのすべてのログ(拡張機能のログを含む)を確認できます。

ここに画像の説明を入力してください


それが開きます「〜/ライブラリ/ Logs / CoreSimulator / <DEVICE_IDENTIFIER> /system.log」あなたは簡単に他のシミュレータのデバイスログのそこにすべてを見つけることができるように、あまりにもちょうど置き換える <DEVICE_IDENTIFIER>シミュレータ装置のIDを持つ
Hofi

32

NSLog完璧に働いています。

Xcodeデバッガーが拡張機能にアタッチされていないため、Xcodeのデバッグ領域に何がログに記録されているかがわかりません。拡張機能は、それを含むアプリからほぼ完全に独立しています。たとえば、それらは別個のバンドルIDを持ち、OS上の別個のプロセスでもあります。

Xcodeを拡張機能にアタッチすることで、さまざまな成功を収めてきました。おそらく自動的に接続されるようで、デバッグナビゲーターに「接続待ち」と表示されますが、接続されることはありません。

Xcodeで拡張機能ターゲットを実行できる場合があります。

ここに画像の説明を入力してください

次に、拡張機能を実行するアプリケーションを選択するオプションがあります。この場合、通知センターである「今日」の推奨を選択します。

ここに画像の説明を入力してください

そして、それは時々デバッガーを私の拡張に接続します。この方法は物理デバイスでのみ機能することに注意してください。

取り付けられない場合は、@ VinceYaunの回答で手動の取り付け方法を使用できます。

私はまた、他の愛着方法を使ってさまざまな成功を収めてきました。ほとんどは失敗しており、後日修正されるバグに過ぎないようです。

ログメッセージを表示するには、トップバーのWindow-> Devicesに移動し、デバイスを選択します。そのウィンドウの下部からデバイスログを表示できます。シミュレーターでテストする場合は、@ BalestraPatrickの回答を使用できます。

バグのいくつかはベータ2で修正されており、私の推測では、最終的にデバッガーは拡張機能を起動したときに自動的に接続されます。

更新: iOS 8 Beta 4 リリースノート

拡張

ベータ4で修正

  • Xcodeからデバッグする場合、拡張機能の起動に失敗することがあります。
  • UIを備えた拡張機能が強制終了されると、再起動して閉じられません。
  • 共有またはアクション拡張機能がハングすることがあります。
  • 拡張機能を再デプロイすると、通知センターで拡張機能が無効になる場合があります。

Storage Extensionsに対して同じアプローチを試しましたか?
SRP-Achiever 2014年

Xcode 6ベータ2ではうまくいきませんでしたが、Vince Yuanの答えはうまくいきました。残念ながら、Xcode 6ベータ3拡張機能のデバッグは、私にはまったく機能しません。その問題の解決策は見つかりませんでした。おそらく次のリリースを待たなければなりません。
Darrarski、2014

@Darrarski私の答えはベータ1から残っています。参考までに、ベータ3は出ましたので、あなたは今までにそれでいるはずです。
サンタクロース14

@SantaClausはかなり明確です。私のコメントは、与えられた解決策のどれも私にとってXcode 6ベータ3で機能しないことを通知することでした。このリリースでは、拡張機能のデバッグがさらに壊れているようです。次のベータ版で問題が解決することを願っています。
Darrarski 14

3
これらのバグはいずれも、ベータ4(現在はベータ5)で修正されたようには見えませんでした。
2014

18

私もこの問題を抱えています。Xcodeがデバッガを拡張機能にアタッチしたり、NSLogメッセージを表示したりすることはありません。Xcodeデバッガーを拡張プロセスに手動で接続する場合、少なくともブレークポイントは魅力のように機能します。

Debug->Attach to process->Your extension name (mine was "com.example.MyExtensionApp.MyExtension")

5
私はこれで運がまちまちです。
サンタクロース2014年

2
賛成票を投じますが、常に機能するわけではありません。Appleが将来のリリースで拡張機能にデバッガを自動的にアタッチできることを願っています。
Jing

14
  1. 拡張機能のスキームを作成する
  2. 実行スキーム
  3. ダイアログでコンテナーアプリを選択します
  4. 楽しい

それは私のため働く :)


これはまさに私が必要としたものです
pob21

1
NSLogコンテナーアプリを実行している場合にのみ機能します。それはないでしょうあなたの代わりにコンテナのアプリ拡張を実行している場合に動作します。
JaredH 2016

これも私にとってはうまくいきました。Maciek Czarnik、ありがとう!上記の解決策ではうまくいきませんでした。Xcode 8.1を使用しています。
plam4u 2016

5

Xcode 8は拡張機能をデバッグできます:

  1. 停止ボタンの横のコンボで拡張スキームを選択して実行します。
  2. 表示されるダイアログで親アプリケーションを選択します。

結果:ブレークポイントとログは通常どおり機能します。


2
今日の拡張機能の場合は機能しません。CLANGエラーの取得:ld:-lRPushのライブラリが見つかりませんclang:エラー:リンカーコマンドが終了コード1で失敗しました(-vを使用して呼び出しを確認)
BadmintonCat

これは無関係なエラーです。不足しているライブラリにリンクしようとしています。ターゲットにLiferay-Pushを追加します。
Jano、2016

4

Michaelの提案Appleのドキュメントに基づいて、最終的にデバッグエリアでログを表示できるようになったのは、次のとおりです。

シミュレーターでアプリ拡張機能をビルドして実行し、ホストアプリのプロンプトが表示されたら、拡張機能を呼び出す特定のアプリをから選択します。私の場合、私はSafariからPDFで共有シートをプルしてアクション拡張機能を起動していました。

以前は機能していなかったのは、Todayをホストとして使用するという他の人の提案に従いましたが、そのアプリを終了してSafariに移動して私の拡張機能を呼び出していました。拡張機能を実行する前に、それを含むアプリを最初に実行する必要さえありません。

Appleのドキュメントから:

拡張スキームの実行フェーズでは、ホストアプリを実行可能ファイルとして指定します。指定されたホストのUIを介して拡張機能にアクセスすると、Xcodeデバッガーが拡張機能にアタッチします。



1

私にとってうまくいくトリック(かなり醜いものですが)はUILabel、拡張機能の下部の隅のどこかにダミーを配置することです。私は通常それを呼びますlogLabel。ログに記録したいログステートメントを使用して、このラベルのテキストを更新することができます。異なるクラスのインスタンスからのステートメントをログに記録する必要がある場合、このようなアプローチはあまり良くありません。そして、明らかに、UIが乱雑になります。

ただし、かなり単純なウィジェットがあり、UIのわずかな乱雑さを気にしない場合は、これでうまくいきます。私はこの議論で概説された他のすべての解決策を試しました、そして残念なことに、それらのどれも私のためにうまくいきませんでした。


1

私にとってデバッグが機能する唯一の方法は、[デバッグ]-> [PIDまたは名前でプロセスにアタッチ]を選択することです。次に、拡張名ではなくPIDを入力します。PIDを見つけるには、デバイスで拡張機能を実行し、[ウィンドウ]> [デバイス]に移動します。デバイスを見つけてコンソールを表示します。内線の名前が表示されたら、その後ろに5桁の数字が続きます。それがPIDです

また、PIDを見つけるために、エクステンションに一連のNSLogを追加しました。これはxCode 7にあります


1

の拡張に関する同じ問題NSLog、およびブレークポイントに遭遇します。私は何日もそれと戦ってきました。

Device log次の画像のように見つけることができます。ですXCode -> Window -> Devices and Simulators

を入力するとOpen Console、ダイアログの右上に検索フィールドがあります。そこでフィルタールールを適用できます。たとえば、プロセス名にNotificationキーワードが含まれている、またはプロセス名が拡張ターゲットの名前と同じである必要がありMyNotificationServiceExtensionます。例:プロセス名と等しい。

デバイスログ


0

Xcode6-B5で明らかに何かが壊れています。

シミュレーターでPhoto拡張機能を実行しようとすると、拡張機能の添付プロセスのオプションとしてPhotos.appが表示されません。

シミュレーター内のデバッグオプション

同じことを実際のデバイスで実行すると、正しい動作が得られます。

実際のデバイスでのデバッグオプション

最初のケースでは、ブレークポイントは適用されません。後者の場合、ブレークポイントはチャームのように機能します。


0

LLVMは一度に1つのスレッドしかデバッグしないが、コンテナーアプリと拡張機能はiOSで完全に2つの異なるプロセスであることを知っておく必要がある。

ほとんどの問題は@Vince Yuanの方法で解決できます。

ただし、私の問題は、XcodeデバッガーがiOSシミュレーターとデバイスの両方のキーボード拡張機能にほとんどフックしないことです。たとえば、7〜8回の実行で1回、それは完全に確率の問題です。@Vince Yuanの方法も時々機能します。

私の小さな経験では、デバッグスキームを実行するときに、左側のパネルのデバッグセッションに「デバッグセッションなし」と表示されている場合、拡張機能を開いてテストする必要はありません。デバッガーはフックせず、実行するだけです。幸運のために再び。

しかし、com.xxx.xxx.xxxがAttachを待機しているのを確認すると、拡張機能は確実にデバッグされます。

これは、iOS拡張機能、特にキーボード拡張機能をデバッグできない小さなトリックです。


0

Xcode 6 Beta 5以降、iOS8を実行している実際のデバイスを使用して拡張機能をデバッグすることができました。デバイスで実行して、起動するSafariを選択してください


0

IDEの変化によって引き起こされるすべての状態を克服するために、lemonjar.comのiOSコンソールを使用しています。接続されたiOSデバイスのコンソールウィンドウが表示され、プロセスIDに関係なくsyslogメッセージが表示されます。アプリと拡張機能の両方のデバッグログメッセージをここで一度に確認できます。


0

以下で説明する方法で拡張機能をデバッグできます。

  1. XcodeDebug-> Attach to process by PID or Name。拡張スキーム名。
  2. 次に、あなたmain app targetを選択して実行します。

皆さんにもお役に立てば幸いです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.