我刚开始使用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语句上设置断点。调试器在该行停止,但我没有在调试控制台中看到日志语句。
答案 0 :(得分:15)
我可以用一个简单的测试应用程序重现它,没有WatchKit。该应用程序包含一个NSTimer打印"计时器已解雇"每一秒。 (此代码100%正确;)。手动连接到流程后,日志中没有显示任何内容 据我所知NSLog输出到stderr,我想附加调试器不会将stderr重定向到Xcode终端。
如果您可以使用控制台应用程序或终端查看日志,则可以执行此操作。 iOS8将模拟器日志存储在~/Library/Logs/CoreSimulator/<Device-UUID>
中。在此目录中,您将找到一个system.log,其中包含您的所有NSLog
输出。
您可以在终端(cat
,grep
,tail
)中查看,或在Console.app中打开它。
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中进行的。
答案 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 中的调试控制台没有显示任何内容(只是一个空的白框)。
我的解决方案是底部的一个小开关,它在“变量视图”和实际调试控制台之间切换。
答案 6 :(得分:-2)