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

viewDidLoadiOS 8扩展中。NSLogXcode 中没有任何输出。 NSLog虽然在容器应用程序中照常工作。

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

4

16 回答 16

98
  1. 调试适用于应用程序扩展。
  2. 它也适用于模拟器。
  3. 如果你的 app ext 在模拟器中崩溃了,你可能会发现重启 app ext 并不容易。重新启动模拟器是一个快速的解决方案。
  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 菜单 Debug -> Attach to Process -> 在菜单的 System 部分中选择“MyExtension(您的扩展名)”。

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

于 2014-06-18T15:00:16.627 回答
49

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

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

在此处输入图像描述

于 2014-06-04T16:55:13.247 回答
32

NSLog工作正常

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

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

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

在此处输入图像描述

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

在此处输入图像描述

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

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

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

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

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

更新:在 iOS 8 Beta 4发行说明中

扩展

在 beta 4 中修复

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

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

Debug->Attach to process->Your extension name (mine was "com.example.MyExtensionApp.MyExtension")
于 2014-06-05T09:12:18.800 回答
15
  1. 为您的扩展创建方案
  2. 运行方案
  3. 在对话框中选择容器应用
  4. 享受

它对有用:)

于 2014-11-05T22:38:16.627 回答
5

Xcode 8 能够调试扩展:

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

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

于 2016-08-15T17:47:50.253 回答
5

根据Michael 的建议Apple 的文档,最终让我在调试区域看到日志的是:

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

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

来自 Apple 的文档:

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

于 2017-02-22T02:05:14.530 回答
1

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

Apple 有与调试、分析和测试您的应用扩展直接相关的文档。

于 2015-05-02T19:49:31.733 回答
1

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

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

于 2015-07-14T19:12:09.490 回答
1

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

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

于 2015-10-20T13:45:25.923 回答
1

遇到关于扩展NSLog和断点的相同问题。我已经与它斗争了很多天。

Device log可以找到如下图。它位于XCode -> Window -> Devices and Simulators.

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

设备日志

于 2018-05-02T08:17:52.827 回答
0

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

于 2014-08-08T03:30:30.417 回答
0

很明显,Xcode6-B5 出了问题。

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

模拟器中的调试选项

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

使用真实设备的调试选项

在第一种情况下,任何断点都不会受到尊重。在后一种情况下,断点就像一个魅力。

于 2014-08-13T12:48:20.187 回答
0

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

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

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

我的一点经验是,当您运行调试方案时,如果左侧面板中的调试会话显示“无调试会话”,则无需打开您的扩展并对其进行测试,调试器没有挂起,只需运行再次幸运。

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

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

于 2014-09-05T16:50:20.653 回答
0

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

于 2015-02-15T20:58:10.067 回答
0

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

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

我希望它也适用于你们。

于 2018-02-20T13:33:21.540 回答