Xcode附加到进程不显示NSLog

我刚刚开始使用Apple Watch。 我从“ Five Minute Watchkit ”中find说明,让iOS应用程序和手表套件应用程序都在模拟器中运行,并且两个进程都连接到LLDBdebugging器。

我所做的就是启动并退出iOS应用程序,在SIM卡中安装最新版本。 然后我切换到watchKitscheme,并启动它,它在手表模拟器上显示我的手表应用程序UI。

然后我在模拟器中启动相应的iOS应用程序,然后用户在Xcode菜单中“附加到进程”,将debugging器附加到正在运行的iOS应用程序。

这工作。 我可以在手表套件InterfaceController或iOS应用程序中设置断点,并在应用程序中打开debugging器。

但是,我没有从我的iOS应用程序debugging控制台中看到NSLog()语句。 (我确实看到了WatchKit扩展代码中的日志语句。)如果我在iOS应用程序中设置了一个断点,它应该在该断点处停止。 我认为从NSLog的控制台输出缺乏有一些附加到SIM上运行的进程,而不是从Xcode启动,但我不知道是什么东西。

(顺便说一句,将一个动作附加到从断点调用NSLog的断点上也不会显示,但是“日志消息”debugging器命令会显示。是否有人有任何见解?)

编辑:在iOS应用程序中的代码似乎并不重要。 在我的情况下,这是一个简单的IBAction附加到iOS应用程序故事板中的一个button:

- (IBAction)buttonAction:(UIButton *)sender; { NSLog(@"Button clicked on iPhone"); } 

我可以在该NSLog语句上设置断点。 debugging器在该行停止,但是在debugging控制台中看不到日志语句。

我可以通过一个简单的testing应用程序来重现,无需WatchKit。 该应用程序包含一个NSTimer,每秒打印“计时器”。 (这段代码是100%正确的;)。 手动附加到进程后,日志中没有显示任何内容。
据我所知NSLog输出到标准错误,我想附加debugging器不会redirect标准错误到Xcodeterminal。

如果您可以使用控制台应用程序或terminal来查看您的日志,那么可以这样做。 iOS8将模拟器日志存储在~/Library/Logs/CoreSimulator/<Device-UUID> 。 在这个目录下你会发现一个system.log,里面包含了你所有的NSLog输出。

您可以在terminal( catgreptail )中查看它,或者在Console.app中打开它。

在这里输入图像说明


Apple在技术说明TN2239:iOS Debugging Magic中确认(至less对于GDB)。

控制台输出

许多程序,实际上还有许多系统框架,将debugging消息打印到stderr。 这个输出的目的地最终由程序控制:它可以将stderrredirect到它select的任何目的地。 但是,在大多数情况下,程序不会redirectstderr,因此输出会转到程序从其启动环境inheritance的默认目标。 这通常是以下之一:

  • 如果启动一个GUI应用程序,它将由普通用户启动,系统会将打印在stderr上的所有消息redirect到系统日志。 您可以使用前面介绍的技术查看这些消息。
  • 如果从Xcode中运行程序,则可以在Xcode的debugging器“控制台”窗口中看到它的stderr输出(从“运行”菜单中select“控制台”菜单项以查看此窗口)。

附加到正在运行的程序(使用Xcode的“附加到进程”菜单或GDB中的附加命令)不会自动将程序的stderr连接到GDB窗口。 您可以使用技术说明TN2030“GDB for MacsBug Veterans”中的“Seeing stdout and stderr After Attach”一节中所述的技巧从GDB内部执行此操作。

提到的TN2030不再在他们的服务器( 镜像 )上可用。 它展示了如何将stdout和stderrredirect到Xcode控制台。 但是,因为shell tty不是一个有效的LLDB命令,所以它不会有太大的帮助。 但也许有一种不同的方式来访问tty Xcodes控制台使用,所以我附加了TN的重要部分。

看到stdout和stderr后,连接

如果将GDB附加到进程(而不是从GDB中启动进程),则无法看到进程打印到stdout或stderr的任何内容。 Finder启动的程序通常将stdout和stderr连接到“/ dev / console”,所以他们打印的信息会传送到控制台。 您可以通过启动控制台应用程序(在“实用程序”文件夹中)来查看,但是,在单独的窗口中查看是不方便的。 另一种方法是将进程的stdout或stderr连接到GDBterminal窗口的terminal设备。 清单9显示了如何做到这一点。

清单9.将stdout和stderr连接到GDB的terminal设备。

 (gdb) attach 795 [... output omitted ...] (gdb) call (void) DebugPrintMenuList() No output )-: Close the stdout and stderr file descriptors. (gdb) call (void) close(1) (gdb) call (void) close(2) Determine the name of the terminal device for GDB itself. (gdb) shell tty /dev/ttyp1 Reopen stdout and stderr, but connected to GDB's terminal. The function results should be 1 and 2; if not, something is horribly wrong. (gdb) call (int) open("/dev/ttyp1", 2, 0) $1 = 1 (gdb) call (int) open("/dev/ttyp1", 2, 0) $2 = 2 Try the DebugPrintMenuList again. (gdb) call (void) DebugPrintMenuList() Yay output! Index MenuRef ID Title ----- ---------- ---- ----- <regular menus> 00001 0x767725D3 -21629 Ed 00002 0x76772627 1128 <Apple> 00003 0x767726CF 1129 File 00004 0x76772567 1130 Edit [... remaining output omitted ...] 

要添加到Filipp Keks的答案,这是一个比接受的答案更简单的方法来做的视觉表示。

从Filipp Keks的回答:“1)插入设备并打开Xcode

2)从菜单栏中select窗口 – >设备

3)在左栏的DEVICES部分下,select设备

4)要查看设备控制台,请单击右侧面板左下方的向上三angular形

5)点击右下方的向下箭头将控制台保存为文件“

该屏幕截图是在“设备”窗口的Xcode 7.3.1中进行的。

在这里输入图像说明

使用Xcode版本7.2和iOS 9.2等,我发现了以下工作:

0)杀了手机应用程序和观看应用程序
1)selectWatch Extension Target并点击Cmd + R (构build并运行)
2)select电话目标,然后按Ctrl + Cmd + R (无build筑运行)

在我的情况下,我有两个应用程序在他们的模拟器,并获得两个NSLog输出。 我不需要单独附加。 希望这可以帮助。

https://developer.apple.com/library/ios/qa/qa1747/_index.html

1)插入设备并打开Xcode

2)从菜单栏中select窗口 – >设备

3)在左栏的DEVICES部分下,select设备

4)要查看设备控制台,请单击右侧面板左下方的向上三angular形

5)点击右下angular的向下箭头将控制台保存为文件

在我的情况下设置自动查看NSLog,之前根本不显示

在这里输入图像说明

当您将配给configuration文件设置为AdHoc或Distribution时,则Xcode不显示日志,您需要设置开发才能查看日志