如何使用NSLog调试iOS 8扩展?

时间:2014-06-04 07:35:50

标签: ios ios8 xcode6 ios-app-extension

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

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

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

16 个答案:

答案 0 :(得分:94)

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

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

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

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

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


  5. 2014年8月23日更新:

    我发现上面的调试步骤在模拟器上使用iOS 8 SDK beta 5的Xcode 6 beta 6上运行不正常。

    解决方案:

    1. 在模拟器中运行您的扩展程序。
    2. Xcode菜单Debug - >附加到流程 - >选择" MyExtension(您的扩展程序的名称)"在菜单的“系统”部分中。
    3. 断点有效。但我不知道为什么日志不会出现在输出窗口中。

答案 1 :(得分:49)

我也有这个问题。如果你在菜单Debug - >下进入模拟器,它对我有用。打开系统日志...

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

enter image description here

答案 2 :(得分:32)

NSLog正在完美

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

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

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

enter image description here

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

enter image description here

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

如果没有附加,您可以在@ VinceYaun的回答

中使用手动附件方法

我使用其他附着方法也取得了不同的成功。大多数都没有成功,似乎它们只是将在以后修复的错误。

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

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

更新:在iOS 8 Beta 4中release notes

  

扩展

     

已修复测试版4

     
      
  • 从Xcode调试时,扩展有时无法启动。
  •   
  • 当使用UI进行扩展时,它会重新启动并且不会被解除。
  •   
  • 有时您的共享或操作扩展程序可能会挂起。
  •   
  • 重新部署扩展程序可能会在通知中心中将其禁用。
  •   

答案 3 :(得分:18)

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

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

答案 4 :(得分:12)

  1. 为您的分机创建方案
  2. 运行方案
  3. 在对话框中选择容器应用
  4. 享受
  5. 对我有用:)

答案 5 :(得分:3)

Xcode 8能够调试扩展:

  1. 在停止按钮旁边的组合中选择扩展方案并运行它。
  2. 在出现的对话框中选择父应用程序。
  3. 结果:断点和日志照常工作。

答案 6 :(得分:3)

最终允许我根据Michael's suggestionApple's documentation查看调试区域中的日志是:

Build&在模拟器中运行应用扩展程序,当系统提示您输入主机应用时,中选择您要调用扩展程序的特定应用。在我的情况下,我通过在PDF上提取共享表来从Safari启动我的Action扩展。

之前没有工作的是遵循其他人使用今天作为主持人的建议,但随后离开该应用程序并转到Safari来拨打我的分机。在运行扩展程序之前,我甚至不需要先运行我的包含应用程序。

来自Apple的文档:

  

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

答案 7 :(得分:1)

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

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

答案 8 :(得分:1)

对我有用的技巧(尽管它非常难看)是在我的扩展的底角放置一个虚拟UILabel。我通常称之为logLabel。然后,可以使用要记录的任何日志语句更新此标签的文本。如果需要从不同类的实例中记录语句,则此方法不是很好。显然,它会使你的用户界面变得混乱。

但是,如果你有一个相当简单的小部件而你不介意UI的轻微混乱,那就可以了。我已经尝试了本次讨论中概述的所有其他解决方案,遗憾的是,它们都没有为我工作。

答案 9 :(得分:1)

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

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

答案 10 :(得分:1)

遇到有关NSLog的扩展和断点的相同问题。我已经打了很多天了。

Device log可以在以下图片中找到。它位于XCode -> Window -> Devices and Simulators

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

Device log

答案 11 :(得分:0)

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

答案 12 :(得分:0)

显然Xcode6-B5中有些东西被破坏了。

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

debug options within simulator

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

debug options withing a real device

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

答案 13 :(得分:0)

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

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

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

我的小经验是,当你运行调试方案时,如果左侧面板中的调试会话显示“没有调试会话”,则无需打开扩展并测试它,调试器没有挂上,只是为了幸运再次跑。

但是当你看到com.xxx.xxx.xxx正在等待Attach时,扩展肯定会被调试。

这是一个小技巧,无法调试iOS扩展,特别是键盘扩展。

答案 14 :(得分:0)

为了克服因更换IDE而导致的所有状态,我使用的是来自lemonjar.com的iOS控制台 - 它显示任何连接的iOS设备的控制台窗口,无论进程ID如何,都会呈现系统日志消息。您可以在此处同时查看应用和扩展调试日志消息。

答案 15 :(得分:0)

我可以按照下面描述的方式调试我的扩展程序:

  1. Xcode Debug - > Attach to process by PID or Name。您的扩展方案名称。
  2. 然后选择您的main app target并运行。
  3. 我希望它也适合你们。