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


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

viewDidLoadiOS 8 扩展程序中。在 NSLog输出没有在Xcode。NSLog虽然可以在容器应用程序中正常工作。

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


我也有这个问题。也许NSLog坏了。我现在使用断点来调试值。但是它们也确实是越野车。
gallileo 2014年

我有一个类似的问题,调试器从不闩锁,并且总是在Xcode中说“等待连接”。不幸的是,我从谷歌搜索中看不到任何用处,并在此处在Stack上发布了一个问题,尚无任何答案。
Alex Bollbach '16

Answers:


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

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

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

    3. 在Xcode中,按菜单调试->附加到进程->按进程标识符(PID)或名称...,输入应用程序扩展名的标识符,例如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(您的扩展名)”。

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


8
到目前为止,我发现最简单的调试方法(请参阅NSLog)遵循以下步骤:/// 1 ///选择一个容器应用程序架构并运行它。/// 2 ///一旦启动并运行-切换回XCode,然后(甚至不按Stop按钮)选择一个扩展方案,然后按Run按钮。/// 3 ///当系统提示您选择要运行的应用程序时,请选择“今天”。/// 4 ///现在,断点和NSLog应该可以正常工作了。
中断

1
即使在今天,也无法使用,尤其是在发生崩溃之后。这很烦人,我不明白为什么这么难解决。
Cristi Băluță 2014年

3
我尝试使用上面的更新说明,它对我有用。但是,在步骤2中,我没有使用扩展名,而是使用“按进程标识符(PID)或名称...”输入进程的pid。这神奇地使我可以使用断点。
tony.tc.leung

调试>通过PID或名称附加到进程:在文本字段中,在调试导航器中输入进程名称,例如com.company.AppName.AppName-ExtensionName
TigerCoding

这个答案与问题无关。OP询问为什么NSLog消息未在扩展中写入控制台(这是我关注此问题时的合理关注)。他没有提及有关连接调试器的问题。
乔伊·卡森

49

我也有这个问题。如果您进入“调试”->“打开系统日志...”菜单下的“模拟器”,它将对我有用。

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

在此处输入图片说明


它将打开 “〜/ Library / Logs / CoreSimulator / <DEVICE_IDENTIFIER> /system.log”,因此您可以轻松找到所有其他模拟器设备日志,只需将 <DEVICE_IDENTIFIER>替换为模拟器设备ID
Hofi,2016年

32

NSLog运行完美

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

在使Xcode附加到扩展方面,我取得了各种成功。似乎它会自动附加,并且在调试导航器中显示为“等待附加”,但是从不附加。

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

在此处输入图片说明

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

在此处输入图片说明

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

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

使用其他依恋方法也取得了不同的成功。大多数都没有成功,看来它们只是以后会修复的错误。

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

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

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

扩展名

已在Beta 4中修复

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

您是否对存储扩展尝试了相同的方法?
SRP-Achiever

在Xcode 6 beta 2中,它对我不起作用,但文斯·袁(Vince Yuan)的答案确实有用。不幸的是,在Xcode 6 beta 3扩展中调试对我根本不起作用。我没有找到解决该问题的方法,可能我们必须等待下一个版本。
Darrarski 2014年

@Darrarski我的答案是Beta 1遗留下来的。仅供参考,Beta 3已经发布,因此您现在应该这样做。
圣诞老人

@SantaClaus很清楚。我的评论是通知我,给定的解决方案均不适用于Xcode 6 beta 3。在此发行版中,扩展调试似乎更加困难。希望下一个Beta版能够解决该问题。
Darrarski 2014年

3
在Beta 4(现在是Beta 5)中,这些错误都没有修复。
马特2014年

18

我也有这个问题。Xcode永远不会将调试器附加到扩展程序上,也不会显示NSLog消息。如果您将Xcode调试器手动附加到扩展过程中,至少断点会像超级按钮一样工作:

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

5
我对此感到好运。
圣诞老人

2
支持但并非总是可行,希望苹果公司可以在将来的版本中自动将调试器附加到扩展程序中。
2014年

14
  1. 为您的扩展程序创建方案
  2. 运行方案
  3. 在对话框中选择容器应用
  4. 请享用

它对有用:)


这正是我所需要的
pob21 2014年

1
NSLog仅在运行容器应用程序时有效。如果您正在运行应用程序扩展名而不是容器,则它将无法正常工作。
JaredH '16

这也为我工作。谢谢Maciek Czarnik!上述解决方案对我不起作用。我正在使用Xcode 8.1。
plam4u

5

Xcode 8能够调试扩展:

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

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


2
在“今天”扩展程序的情况下不起作用。出现CLANG错误:ld:未找到-lRPush库:clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)
BadmintonCat

这是一个不相关的错误。您正在尝试链接到缺少的库。将Liferay-Push添加到您的目标。
Jano

4

根据迈克尔的建议苹果的文档,最终使我能够在调试区域中看到日志的原因,是:

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

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

从Apple文档中:

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



1

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

但是,如果您有一个非常简单的小部件,并且您不介意UI过于混乱,那么就可以解决问题。我尝试了本次讨论中概述的所有其他解决方案,但不幸的是,这些解决方案都不适合我。


1

调试对我而言唯一有效的方法是选择“调试”->“按PID或名称附加到进程”,然后输入PID而不是扩展名。您可以通过在设备上运行扩展程序找到PID,然后转到“窗口”->“设备”。找到您的设备并查看控制台。当您看到扩展名时,其后跟5位数字。那就是PID

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


1

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

Device log可以找到如下图。它是在XCode -> Window -> Devices and Simulators

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

设备日志


0

显然Xcode6-B5中有问题。

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

模拟器中的调试选项

在真实设备上运行的相同对象,会给我正确的行为。

与真实设备一起调试选项

在第一种情况下,不接受任何断点。在后一种情况下,断点就像一个符咒。


0

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

您可以使用@Vince Yuan的方法解决大多数问题。

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

我的小经验是,当您运行调试方案时,如果左侧面板中的debug Session显示“ No Debug Session”,则无需打开扩展并对其进行测试,调试器不会挂接,只需运行再次幸运。

但是当您看到com.xxx.xxx.xxx正在等待附加时,扩展名肯定可以得到调试。

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


0

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


0

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


0

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

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

我希望它也对你们有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.