- (void)viewDidLoad
{
NSLog(@"%s", __func__);
// ...
}
在viewDidLoad
iOS 8扩展中。NSLog
Xcode 中没有任何输出。 NSLog
虽然在容器应用程序中照常工作。
如何从扩展的调试消息中获取输出?
- (void)viewDidLoad
{
NSLog(@"%s", __func__);
// ...
}
在viewDidLoad
iOS 8扩展中。NSLog
Xcode 中没有任何输出。 NSLog
虽然在容器应用程序中照常工作。
如何从扩展的调试消息中获取输出?
调试应用扩展的步骤:
运行容器应用程序。在这一步中,Xcode 将容器应用和应用扩展上传到设备或模拟器。
停止容器应用程序。在模拟器中调试时,此步骤很重要。如果你不这样做,Xcode 会告诉你模拟器正在使用中。
在 Xcode 中,按菜单 Debug -> Attach to Process -> By Process Identifer (PID) or Name...,输入 app ext 的标识符,例如 com.abc.ContainerApp.MyExtension,开始调试。不要忘记设置断点。(2014 年 8 月 25 日更新:您可以直接输入 MyExtension(您的扩展名)。)
在设备或模拟器中,打开您的应用扩展程序。
我发现上面的调试步骤在 Xcode 6 beta 6 和模拟器上的 iOS 8 SDK beta 5 上效果不佳。
解决方案:
断点工作。但我不知道为什么日志不显示在输出窗口中。
我也有这个问题。如果您进入模拟器下的菜单 Debug -> Open System Log... 它对我有用
从这里您可以看到 iPhone 模拟器的所有日志(包括您的扩展程序的日志)。
NSLog
工作正常。
您只是看不到在 Xcode 的调试区域中记录了什么,因为 Xcode 调试器未附加到您的扩展。扩展几乎完全独立于其包含的应用程序。例如,它们具有单独的包标识符,并且它们也是操作系统上的单独进程。
我在让 Xcode 附加到扩展方面取得了不同程度的成功。据说它似乎会自动附加,并且它在调试导航器中显示为“等待附加”,但从不附加。
有时,我可以在 Xcode 中运行我的扩展目标:
然后可以选择在哪个应用程序中运行我的扩展。在这种情况下,我会选择“今天”的推荐,即通知中心。
然后它有时会将调试器附加到我的扩展。请注意,此方法似乎仅适用于物理设备。
如果没有附加,您可以使用@VinceYaun 回答中的手动附加方法,
使用其他依恋方法,我也取得了不同程度的成功。大多数都没有成功,似乎它们只是稍后会修复的错误。
要查看您的日志消息,请转到顶部栏中的Window
->并选择您的设备。Devices
您可以从该窗口的底部调出设备日志。如果您在模拟器上进行测试,您可以使用@BalestraPatrick 的答案。
Beta 2 中已经修复了一些错误,我猜测最终调试器将在启动扩展时自动附加。
更新:在 iOS 8 Beta 4发行说明中:
扩展
在 beta 4 中修复
- 从 Xcode 调试时,扩展有时无法启动。
- 当带有 UI 的扩展被终止时,它会重新启动并且不会被关闭。
- 有时,您的共享或操作扩展程序可能会挂起。
- 重新部署扩展可能会在通知中心禁用它。
我也有这个问题。Xcode 从不将我的调试器附加到扩展或显示 NSLog 消息。如果您手动将 Xcode 调试器附加到您的扩展进程,那么至少断点就像一个魅力:
Debug->Attach to process->Your extension name (mine was "com.example.MyExtensionApp.MyExtension")
它对我有用:)
Xcode 8 能够调试扩展:
结果:断点和日志照常工作。
根据Michael 的建议和Apple 的文档,最终让我在调试区域看到日志的是:
在模拟器中构建并运行应用程序扩展程序,当提示您提供主机应用程序时,选择您要从中调用扩展程序的特定应用程序。就我而言,我通过在 PDF 上拉出共享表来从 Safari 启动我的操作扩展。
以前没有工作的是遵循其他人使用 Today 作为主机的建议,然后离开该应用程序并转到 Safari 调用我的扩展程序。在运行扩展程序之前,我什至不再需要先运行我的包含应用程序。
来自 Apple 的文档:
在扩展方案的运行阶段,您将主机应用程序指定为可执行文件。通过该指定主机的 UI 访问扩展时,Xcode 调试器将附加到扩展。
实际上,我让日志在 Xcode 6.3 中运行起来非常简单。首先,构建并运行包含的应用程序。一旦包含的应用程序在设备上运行,通过将方案更改为应用程序扩展来构建并运行应用程序扩展。
对我有用的一个技巧(虽然它很丑陋)是UILabel
在我的扩展程序的底角的某个地方放置一个假人。我通常称之为logLabel
。然后可以使用您想要记录的任何日志语句更新此标签的文本。如果您需要记录来自不同类实例的语句,这种方法不是很好。而且,很明显,它会使你的 UI 变得混乱。
但是,如果您有一个相当简单的小部件并且您不介意 UI 的轻微混乱,那么这可以解决问题。我已经尝试了本次讨论中列出的所有其他解决方案,但遗憾的是,它们都不适合我。
调试对我有用的唯一方法是选择 Debug->Attach To Process By PID or Name 然后输入PID而不是扩展名。您可以通过在设备上运行扩展来找到 PID,转到 Window->Devices。找到您的设备并查看控制台。当您看到您的分机名称时,其后跟 5 位数字。那是PID
我还在扩展中放了一堆 NSLog,以便也找到 PID。这是在 xCode 7 上
从 Xcode 6 Beta 5 开始,我已经能够使用运行 iOS8 的实际设备来调试我的扩展。尝试在设备上运行它并选择 Safari 以启动
很明显,Xcode6-B5 出了问题。
如果我尝试在模拟器上运行照片扩展,我看不到任何 Photos.app 作为扩展附加过程的选项。
同样,在真实设备上运行,给我正确的行为。
在第一种情况下,任何断点都不会受到尊重。在后一种情况下,断点就像一个魅力。
你应该知道,容器应用程序和扩展在 iOS 中完全是两个不同的进程,而 LLVM 一次只调试一个线程,所以当你调试时,控制台永远不会记录扩展,也永远不会在断点处停止。
您可以通过@Vince Yuan 的方法解决大部分问题。
但是,我的问题是 Xcode 调试器几乎不会在我的 iOS 模拟器和设备上的键盘扩展上挂钩,比如 7-8 次运行中的 1 次,这完全是概率问题。@Vince Yuan 的方法有时也适用。
我的一点经验是,当您运行调试方案时,如果左侧面板中的调试会话显示“无调试会话”,则无需打开您的扩展并对其进行测试,调试器没有挂起,只需运行再次幸运。
但是当你看到 com.xxx.xxx.xxx is waiting to Attach 时,扩展肯定可以被调试。
对于无法调试 iOS 扩展,尤其是键盘扩展的人来说,这是一个小技巧。
为了克服由不断变化的 IDE 引起的所有状态,我正在使用来自 lemonjar.com 的 iOS 控制台——它显示一个控制台窗口,用于任何连接的 iOS 设备呈现系统日志消息,而不管进程 ID。您可以在此处同时查看应用程序和扩展程序调试日志消息。
我可以使用下面描述的方式调试我的扩展:
Debug
-> Attach to process by PID or Name
。您的扩展方案名称。main app target
并运行。我希望它也适用于你们。