Xcode附加到进程不显示NSLog

时间:2015-03-17 17:39:08

标签: ios objective-c xcode apple-watch

我刚开始使用Apple Watch。我找到了来自“Five Minute Watchkit”的说明,让iOS应用程序和监视工具包应用程序都在模拟器中运行,并且两个进程都连接到LLDB调试器。

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

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

这很有效。我可以在监视工具包InterfaceController或我的iOS应用程序中设置断点,调试器会在应用程序中断点。

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

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

编辑: iOS应用程序中的代码似乎并不重要。就我而言,这是一个简单的IBAction,它附加在iOS应用程序故事板中的按钮上:

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

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

7 个答案:

答案 0 :(得分:15)

我可以用一个简单的测试应用程序重现它,没有WatchKit。该应用程序包含一个NSTimer打印"计时器已解雇"每一秒。 (此代码100%正确;)。手动连接到流程后,日志中没有显示任何内容 据我所知NSLog输出到stderr,我想附加调试器不会将stderr重定向到Xcode终端。

如果您可以使用控制台应用程序或终端查看日志,则可以执行此操作。 iOS8将模拟器日志存储在~/Library/Logs/CoreSimulator/<Device-UUID>中。在此目录中,您将找到一个system.log,其中包含您的所有NSLog输出。

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

enter image description here


Apple在Technical Note TN2239: iOS Debugging Magic中确认(至少对于GDB)。

  

控制台输出

     

许多程序,实际上是许多系统框架,都打印调试   消息给stderr。此输出的目标是最终的   由程序控制:它可以将stderr重定向到任何东西   它选择的目的地。但是,在大多数情况下,程序不会   重定向stderr,因此输出转到默认目标   程序从其启动环境继承。这是   通常是以下之一:

     
      
  • 如果您启动GUI应用程序,因为它将由正常启动   用户,系统将stderr上打印的任何消息重定向到   系统日志。您可以使用所述技术查看这些消息   早。
  •   
  • 如果你在Xcode中运行一个程序,你可以看到它   在Xcode的调试器控制台窗口中输出stderr(选择控制台   “运行”菜单中的菜单项可以看到此窗口)。
  •   
     

附加到   运行程序(使用Xcode附加到Process菜单或附加   GDB中的命令)不会自动将程序的stderr连接到   你的GDB窗口。你可以使用这个技巧从GDB中做到这一点   &#34;在附加后看到stdout和stderr&#34;部分   技术说明TN2030,&#39; GDB for MacsBug Veterans&#39;。

上述TN2030在其服务器上不再可用(mirror)。它展示了如何将stdout和stderr重定向到Xcode控制台。但是,由于shell tty不是LLDB的有效命令,因此它不会有多大帮助。但也许有一种不同的方式来访问tty Xcodes控制台使用,所以我附上了TN的重要部分。

  

在附加后看到stdout和stderr

     

如果您将GDB附加到进程(而不是启动进程)   从GDB内部来看,你无法看到这个过程   打印到stdout或stderr。 Finder推出的程序通常是   有stdout和stderr连接到&#34; / dev / console&#34;,所以信息   他们打印到控制台。你可以通过启动来查看   然而,它是控制台应用程序(在Utilities文件夹中)   不方便必须在一个单独的窗口看。另一种选择   是将进程的stdout或stderr连接到终端设备   对于GDB的终端窗口。清单9显示了如何执行此操作。

     

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

(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 ...]

答案 1 :(得分:9)

要添加到Filipp Keks的答案,这里有一个比接受答案要简单得多的方式的直观表示。

来自Filipp Keks的回答: &#34; 1)插入设备并打开Xcode

2)选择窗口 - &gt;菜单栏中的设备

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

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

5)单击右下角的向下箭头将控制台保存为文件&#34;

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

enter image description here

答案 2 :(得分:5)

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

0)杀死手机应用程序并观看应用程序
1)选择Watch Extension Target并点击 Cmd + R (构建并运行)
2)选择电话目标,然后按 Ctrl + Cmd + R (无需建设运行)

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

答案 3 :(得分:3)

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

1)插入设备并打开Xcode

2)选择窗口 - &gt;菜单栏中的设备

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

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

5)单击右下角的向下箭头将控制台另存为文件

答案 4 :(得分:0)

When your Provisioning profile is set to AdHoc or Distribution then Xcode doesnot show log, you need set development to view log

答案 5 :(得分:-1)

我是通过现在关闭的这个 (Xcode console empty after attaching to process) 来解决这个问题的。

我的问题是 Xcode 中的调试控制台没有显示任何内容(只是一个空的白框)。

我的解决方案是底部的一个小开关,它在“变量视图”和实际调试控制台之间切换。

enter image description here

答案 6 :(得分:-2)

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

enter image description here