我可以使用一个简单的测试应用程序(没有 WatchKit)来重现这一点。该应用程序由一个 NSTimer 组成,每秒打印“计时器已触发”。 (此代码 100% 正确;)。我手动附加到进程后,日志中没有显示任何内容。
据我所知 NSLog 输出到 stderr,我猜附加调试器不会将 stderr 重定向到 Xcode 终端。
如果您可以使用控制台应用程序或终端来查看日志,则可以这样做。 iOS8存储模拟器登录信息~/Library/Logs/CoreSimulator/<Device-UUID>
。在此目录中,您将找到一个 system.log,其中包含您的所有信息NSLog
输出。
您可以在终端中查看它(cat
, grep
, tail
),或在 Console.app 中打开它。
Apple 确认(至少对于 GDB 而言)技术说明 TN2239:iOS 调试魔法 https://developer.apple.com/library/ios/technotes/tn2239/_index.html.
控制台输出
很多程序,甚至很多系统框架,都会打印调试
发送至 stderr 的消息。该输出的最终目的地是
由程序控制:它可以将 stderr 重定向到任何内容
它选择的目的地。然而,在大多数情况下,程序并不
重定向 stderr,因此输出转到默认目的地
由程序从其启动环境继承。这是
通常是以下之一:
- 如果您像普通程序一样启动 GUI 应用程序
用户,系统将 stderr 上打印的任何消息重定向到
系统日志。您可以使用所描述的技术查看这些消息
早些时候。
- 如果您从 Xcode 中运行程序,您可以看到它的
Xcode 的调试器控制台窗口中的 stderr 输出(选择 Console
从“运行”菜单的菜单项可以看到此窗口)。
附加到一个
运行程序(使用 Xcode 的“附加到进程”菜单,或附加
GDB 中的命令)不会自动将程序的 stderr 连接到
你的 GDB 窗口。您可以使用以下技巧从 GDB 中执行此操作
在“附加后查看标准输出和标准错误”部分中描述
技术说明 TN2030,“MacsBug 老兵的 GDB”。
所提到的 TN2030 在其服务器上不再可用(mirror http://www.fenestrated.net/~macman/mirrors/Apple%20Technotes%20(As%20of%202002)/tn/tn2030.html)。它展示了如何将 stdout 和 stderr 重定向到 Xcode 控制台。然而,自从shell tty
不是 LLDB 的有效命令,它没有多大帮助。但也许有一种不同的方式来访问 tty Xcodes 控制台使用,所以我附上了 TN 的重要部分。
连接后查看 stdout 和 stderr
如果将 GDB 附加到进程(而不是启动进程)
从 GDB 内部),您将无法看到该进程的任何内容
打印到 stdout 或 stderr。通常由 Finder 启动的程序
将 stdout 和 stderr 连接到“/dev/console”,因此信息
他们打印到控制台。您可以通过启动来查看此内容
然而,控制台应用程序(在实用程序文件夹中)
必须在单独的窗口中查看很不方便。另一种选择
是将进程的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 ...]