运行iPhone模拟器时,您可以将Xcode控制台的日志输出重定向到终端吗?

时间:2009-12-15 20:30:07

标签: iphone xcode debugging terminal

我不喜欢在模拟器(或设备上)调试iPhone应用程序时使用Xcode的控制台输出窗口。我希望能够使用Unix工具箱,并使用grep过滤日志输出。但要做到这一点,我需要让Xcode将正在运行的iPhone应用程序的日志输出发送到终端。

有没有办法实现这个目标?

6 个答案:

答案 0 :(得分:5)

在XCode 6中,日志被点到此处:/Users/<username>/Library/Logs/CoreSimulator/<app guid>/system.log用户名当然是您的系统用户名,而 app guid 是XCode为模拟器生成的内容。

确定 app guid 的最简单方法是为模拟器构建应用程序并查看上次更改的目录:

~ ❯❯❯ cd ~/Library/Logs/CoreSimulator
~/L/L/CoreSimulator ❯❯❯ ls -latr
total 64
-rw-r--r--   1 x  staff    519 27 Aug 21:54 iOS Simulator.log
drwxr-xr-x  13 x  staff    442 27 Aug 21:54 D283605A-0BA9-43B3-AB6B-F4858BE6E45E
drwxr-xr-x  15 x  staff    510  8 Oct 03:56 425D8E41-0842-4F2D-BC22-8C3695E350EF

显然 425D8E41-0842-4F2D-BC22-8C3695E350EF 是最后修改过的目录,所以现在您可以执行tail -f ~/Library/Logs/CoreSimulator/425D8E41-0842-4F2D-BC22-8C3695E350EF/system.log | grep keyword或其他您可能想要对实时日志执行的操作。< / p>

答案 1 :(得分:4)

无法说明它在模拟器中如何工作,但重定向stdout并不是非常困难。假设你想将它传递到你自己的视图中:

#include <unistd.h>

stderr->_write = RedirectOutputToView;
stdout->_write = RedirectOutputToView;

并使用原型:

int RedirectOutputToView(void *inFD, const char *buffer, int size);

答案 2 :(得分:2)

我发现this answer适用于我的目的,虽然它需要运行模拟器才能在终端中直播:

我删除了模拟器检查并在重定向之前添加了一个NSLog语句,因此XCode控制台吐出文件的位置:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *logPath = [documentsDirectory stringByAppendingPathComponent:@"console.log"];
NSLog(@"redirecting STDERR: %@", logPath);
freopen([logPath cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr);

我认为最强大的解决方案是使用日志库(例如CocoaLumberjack )并使用您喜欢的任何目的地进行配置。

答案 3 :(得分:1)

我可以在终端中获取设备输出但是无法同时连接xcode中的调试会话(我猜是因为终端有调试连接)。

使用idevicedebug从终端启动应用程序。

idevicedebug -u <device uuid> run com.myco.apps.myapp

com.myco.apps.myapp是捆绑ID,可以在已安装的应用中看到&#39;设备窗口中的窗格。

认为 idevicedebug与ideviceinstaller一起安装,可以用brew完成

brew install ideviceinstaller

但我建议搜索ideviceinstaller和libimobiledevice(它使用的库)。

这是一个小小的烦恼,但是我发现在终端中获得节目输出的最佳方式。

答案 4 :(得分:1)

为什么不使用Console.app?查看和grep日志的好方法,而不是xCode的调试窗口或终端。默认情况下,这是macOS的一部分。

enter image description here

如果你有C printf语句,那么以下SO有很多有用的信息: Get printf on Console.app

答案 5 :(得分:0)

在Xcode 6中,它已经这样做了。打开与您当前使用的模拟器构建关联的System.log文件。对我来说,就在这里:/Users/josh.lang/Library/Logs/CoreSimulator/3BB4CBFB-5A67-4E93-91B5-78E6E3658A16/system.log

它会保留一切,但我注意到如果我在运行时打开它,它也可以自行重新加载。