【问题标题】:How to debug iOS 8 extensions with NSLog?如何使用 NSLog 调试 iOS 8 扩展?
【发布时间】:2014-07-24 18:13:49
【问题描述】:
- (void)viewDidLoad
{
    NSLog(@"%s", __func__);
    // ...
}

在 iOS 8 扩展viewDidLoad 中。 NSLog 在 Xcode 中不输出任何内容。 NSLog 在容器应用程序中照常工作。

如何从扩展的调试消息中获取输出?

【问题讨论】:

  • 我也有这个问题。也许 NSLog 刚刚坏了。我现在使用断点来调试值。但它们也确实有问题。
  • 我有一个类似的问题,调试器从不锁定并且总是在 Xcode 中说“等待附加”。不幸的是,我从谷歌搜索中看不到任何用处,并在 Stack 上发布了一个尚未得到答案的问题。

标签: ios ios8 xcode6 ios-app-extension


【解决方案1】:
  1. 调试适用于应用扩展。
  2. 它也适用于模拟器。
  3. 如果您的应用程序扩展在模拟器中崩溃,您可能会发现重新启动应用程序扩展并不容易。重新启动模拟器是一种快速的解决方案。
  4. 调试应用扩展的步骤:

    1. 运行容器应用程序。在这一步中,Xcode 将容器应用和应用扩展上传到设备或模拟器。

    2. 停止容器应用。在模拟器中调试时,此步骤很重要。如果你不这样做,Xcode 会告诉你模拟器正在使用中。

    3. 在 Xcode 中,按菜单 Debug -> Attach to Process -> By Process Identifer (PID) or Name...,输入 app ext 的标识符,例如com.abc.ContainerApp.MyExtension,开始调试。不要忘记设置断点。 (2014 年 8 月 25 日更新:您可以直接输入 MyExtension(您的扩展名)。)

    4. 在设备或模拟器中,打开您的应用扩展程序。


2014 年 8 月 23 日更新:

我发现上面的调试步骤在 Xcode 6 beta 6 和 iOS 8 SDK beta 5 的模拟器上无法正常工作。

解决方案:

  1. 在模拟器中运行您的扩展程序。
  2. Xcode 菜单调试 -> 附加到进程 -> 在菜单的系统部分中选择“MyExtension(您的扩展名)”。

断点有效。但我不知道为什么日志没有显示在输出窗口中。

【讨论】:

  • 到目前为止,我发现最简单的调试方法(并查看 NSLog)是按照以下步骤操作: /// 1 /// 选择一个容器应用程序架构并运行它。 /// 2 /// 一旦启动并运行 - 切换回 XCode 并(甚至不按停止按钮)选择扩展模式,然后按运行按钮。 /// 3 /// 当提示选择要运行的应用程序时,选择今天。 /// 4 /// 现在断点和 NSLog 应该可以正常工作了。
  • 即使在今天也无法正常工作,尤其是在崩溃之后。这很烦人,我不明白为什么这么难修复。
  • 我尝试使用上面的更新说明,它对我有用。但是,在第 2 步中,我没有使用我的扩展名,而是使用“按进程标识符 (PID) 或名称...”并输入了进程的 pid。这神奇地让我能够使用我的断点。
  • 调试 > 按 PID 或名称附加到进程:在文本字段中输入调试导航器中的进程名称,例如 com.company.AppName.AppName-ExtensionName
  • 这个答案与问题无关。 OP 询问为什么 NSLog 消息没有在扩展中写入控制台(当我带着同样的问题来到这个页面时,这是一个合理的担忧)。他没有提到连接到调试器的问题。
【解决方案2】:

我也遇到了这个问题。如果你进入模拟器下的菜单 Debug -> Open System Log...,它对我有用。

从这里您可以看到 iPhone 模拟器的所有日志(包括您的扩展程序的日志)。

【讨论】:

  • 它将打开 "~/Library/Logs/CoreSimulator//system.log" 这样您就可以轻松找到所有其他模拟器设备的日志将 替换为模拟器设备 ID
【解决方案3】:

NSLog 工作正常完美

您只是看不到在 Xcode 的调试区域中记录了什么,因为 Xcode 调试器未附加到您的扩展。扩展程序几乎完全独立于其包含的应用程序。例如,它们具有单独的包标识符,并且它们也是操作系统上的单独进程。

我在让 Xcode 附加到扩展方面取得了不同程度的成功。据说它似乎会自动附加,它在调试导航器中显示为“等待附加”,但从不附加。

有时,我可以在 Xcode 中运行我的扩展目标:

然后可以选择在哪个应用程序中运行我的扩展。在这种情况下,我会选择它的推荐“今天”,即通知中心。

然后它会有时将调试器附加到我的扩展。请注意,此方法似乎仅适用于物理设备。

如果没有附加,您可以使用@VinceYaun 回答中的手动附加方法,

我也使用其他依恋方法取得了不同程度的成功。大多数都没有成功,似乎它们只是稍后会修复的错误。

要查看您的日志消息,请转到顶部栏中的 Window -> Devices 并选择您的设备。您可以从该窗口的底部调出设备日志。如果您在模拟器上进行测试,可以使用@BalestraPatrick 的answer

Beta 2 中已经修复了一些错误,我猜测最终调试器会在启动扩展时自动附加。

更新:在 iOS 8 Beta 4 release notes

扩展

在 beta 4 中修复

  • 从 Xcode 调试时,扩展有时无法启动。
  • 当带有 UI 的扩展被终止时,它会重新启动并且不会被关闭。
  • 有时您的共享或操作扩展程序可能会挂起。
  • 重新部署扩展程序可能会在通知中心禁用它。

【讨论】:

  • 您是否尝试过存储扩展的相同方法?
  • 它在 Xcode 6 beta 2 中对我不起作用,但 Vince Yuan answer 起作用了。不幸的是,在 Xcode 6 beta 3 中,扩展调试根本不适合我。我没有找到解决该问题的方法,可能我们必须等待下一个版本。
  • @Darrarski 我的答案是 Beta 1 遗留下来的。仅供参考,Beta 3 已经发布,所以您现在应该使用它。
  • @SantaClaus 很清楚。我的评论是告诉我没有一个给定的解决方案适用于我的 Xcode 6 beta 3。看起来扩展调试在这个版本中更加糟糕。让我们希望下一个测试版能解决这个问题。
  • 在 beta 4(现在是 beta 5)中,这些错误在我看来都没有修复。
【解决方案4】:

我也遇到了这个问题。 Xcode 从不将我的调试器附加到扩展或显示 NSLog 消息。如果您手动将 Xcode 调试器附加到您的扩展进程,那么至少断点就像一个魅力:

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

【讨论】:

  • 我的运气好坏参半。
  • 赞成,但并不总是有效,希望苹果可以在未来的版本中自动将调试器附加到扩展。
【解决方案5】:
  1. 为您的扩展创建方案
  2. 运行方案
  3. 在对话框中选择容器应用程序
  4. 享受

适合我 :)

【讨论】:

  • 这正是我所需要的
  • NSLog 仅在您运行容器应用程序时才有效。如果您运行的是应用程序扩展而不是容器,它不会工作。
  • 这对我也有用。谢谢你,Maciek Czarnik!上述解决方案对我不起作用。我正在使用 Xcode 8.1。
【解决方案6】:

Xcode 8 能够调试扩展:

  1. 在停止按钮旁边的组合中选择扩展方案并运行它。
  2. 在出现的对话框中选择父应用程序。

结果:断点和日志照常工作。

【讨论】:

  • 在我的 Today 扩展中不起作用。收到 CLANG 错误:ld:找不到 -lRPush clang 的库:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
  • 这是一个不相关的错误。您正在尝试链接到丢失的库。将 Liferay-Push 添加到您的目标。
【解决方案7】:

基于Michael's suggestionApple's documentation,最终让我在调试区看到日志的是:

在模拟器中构建并运行应用扩展程序,当提示您提供主机应用程序时,选择您要从中调用扩展程序的特定应用程序。就我而言,我通过在 PDF 上拉出共享表来从 Safari 启动我的操作扩展。

以前没有用的是按照其他人的建议使用 Today 作为主机,然后离开该应用程序并转到 Safari 调用我的扩展程序。在运行扩展程序之前,我什至不再需要先运行我的包含应用程序。

来自 Apple 的文档:

在扩展方案的运行阶段,您将主机应用程序指定为可执行文件。通过指定主机的 UI 访问扩展时,Xcode 调试器会附加到扩展。

【讨论】:

  • 这应该是公认的答案。使用此工作流执行此操作可启用断点和日志记录!谢谢。
【解决方案8】:

我实际上让日志在 Xcode 6.3 中运行起来非常简单。首先,构建并运行包含的应用程序。一旦包含的应用程序在设备上运行,通过将方案更改为应用程序扩展来构建和运行应用程序扩展。

Apple has documentation directly related to debugging, profiling and testing your app extension.

【讨论】:

    【解决方案9】:

    一个对我有用的技巧(虽然它很丑)是在我的扩展程序的底角放置一个虚拟的UILabel。我通常称之为logLabel。然后可以使用您想要记录的任何日志语句更新此标签的文本。如果您需要记录来自不同类实例的语句,这种方法不是很好。而且,很明显,它会使你的 UI 变得混乱。

    但是,如果您有一个相当简单的小部件,并且您不介意 UI 稍微杂乱无章,那么这可以解决问题。我已经尝试了本次讨论中列出的所有其他解决方案,但遗憾的是,它们都不适合我。

    【讨论】:

      【解决方案10】:

      调试对我有用的唯一方法是选择 Debug->Attach To Process By PID or Name 然后输入 PID 而不是扩展名。 您可以通过在设备上运行扩展来找到 PID,转到 Window->Devices。找到您的设备并查看控制台。当您看到您的分机名称时,其后跟 5 位数字。 这是 PID

      我还在扩展中放了一堆 NSLog,以便也找到 PID。 这是在 xCode 7 上

      【讨论】:

        【解决方案11】:

        NSLog 的扩展和断点方面遇到同样的问题。我已经为此奋斗了很多天。

        Device log 如下图所示。它位于XCode -> Window -> Devices and Simulators

        输入Open Console后,对话框右上角有一个搜索栏。我可以在那里应用过滤规则。例如,进程名包含Notification关键字,或者进程名必须等于扩展目标的名称,例如:等于MyNotificationServiceExtension进程名。

        【讨论】:

          【解决方案12】:

          显然 Xcode6-B5 中出现了问题。

          如果我尝试在模拟器上运行照片扩展程序,我看不到任何 Photos.app 作为扩展程序附加过程的选项。

          同样,在真实设备上运行,给我正确的行为。

          在第一种情况下,不支持任何断点。在后一种情况下,断点就像一个魅力。

          【讨论】:

            【解决方案13】:

            你应该知道,容器应用和扩展在 iOS 中完全是两个不同的进程,而 LLVM 一次只调试一个线程,所以当你调试时,控制台永远不会记录扩展,也永远不会在断点处停止。

            @Vince Yuan 的方法可以解决大部分问题。

            但是,我的问题是 Xcode 调试器几乎不会在 iOS 模拟器和设备上连接我的键盘扩展,比如 7-8 次运行中的 1 次,这完全是概率问题。 @Vince Yuan 的方法有时也适用。

            我的小经验是,当你运行调试方案时,如果左侧面板中的调试会话显示“无调试会话”,则无需打开扩展程序并对其进行测试,调试器没有挂钩,再跑一次就好了。

            但是当你看到 com.xxx.xxx.xxx is waiting to Attach 时,这个扩展肯定是可以调试的。

            对于无法调试 iOS 扩展,尤其是键盘扩展的人来说,这是一个小技巧。

            【讨论】:

              【解决方案14】:

              从 Xcode 6 Beta 5 开始,我已经能够使用运行 iOS8 的实际设备来调试我的扩展程序。尝试在设备上运行它并选择 Safari 以启动

              【讨论】:

                【解决方案15】:

                为了克服由不断变化的 IDE 引起的所有状态,我正在使用来自 lemonjar.com 的 iOS 控制台——它显示一个控制台窗口,用于任何连接的 iOS 设备呈现系统日志消息,而不管进程 ID。您可以在此处同时查看应用程序和扩展程序调试日志消息。

                【讨论】:

                  【解决方案16】:

                  我可以使用下面描述的方式调试我的扩展:

                  1. Xcode : Debug -> Attach to process by PID or Name。您的扩展方案名称。
                  2. 然后选择您的main app target 并运行。

                  我希望它也适用于你们。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2016-02-05
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-12-18
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多