簡體   English   中英

運行iPhone模擬器時,您可以將Xcode控制台的日志輸出重定向到終端嗎?

[英]Can you redirect log output of Xcode console to Terminal when running iPhone Simulator?

我不喜歡在模擬器(或設備上)調試iPhone應用程序時使用Xcode的控制台輸出窗口。 我希望能夠使用Unix工具箱,並使用grep過濾日志輸出。 但要做到這一點,我需要讓Xcode將正在運行的iPhone應用程序的日志輸出發送到終端。

有沒有辦法實現這個目標?

在XCode 6中,日志在這里被提取: /Users/<username>/Library/Logs/CoreSimulator/<app guid>/system.log 用戶名當然是你的系統用戶名,而app guid是XCode為模擬器生成的東西。

確定應用程序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 tail -f ~/Library/Logs/CoreSimulator/425D8E41-0842-4F2D-BC22-8C3695E350EF/system.log | grep keyword或您可能要對實時日志執行的任何其他操作。

不能說它在模擬器中如何工作,但重定向stdout並不是非常困難。 假設您想將它管道輸入您自己的視圖:

#include <unistd.h>

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

並使用原型:

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

我發現這個答案適用於我的目的,雖然它需要運行模擬器才能在終端中實時流式傳輸:

我刪除了模擬器檢查並在重定向之前添加了一個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 )並使用您喜歡的任何目的地進行配置。

我可以在終端中獲取設備輸出但是無法同時連接xcode中的調試會話(我猜因為終端有調試連接)。

使用idevicedebug從終端啟動應用程序。

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

其中com.myco.apps.myapp是包ID,可以在設備窗口的“已安裝的應用程序”窗格中看到。

認為 idevicedebug與ideviceinstaller一起安裝,可以用brew完成

brew install ideviceinstaller

但我建議搜索ideviceinstaller和libimobiledevice(它使用的庫)。

這是一個小煩惱,但我發現在終端中獲得程序輸出的最佳方式。

為什么不使用Console.app 查看和grep日志的好方法,而不是xCode的調試窗口或終端。 默認情況下,這是macOS的一部分。

在此輸入圖像描述

如果你有C printf語句,那么下面的SO有很多有用的信息: 在Console.app上獲取printf

在Xcode 6中它已經做到了這一點。 打開與您當前使用的模擬器構建關聯的System.log文件。 我在這里:/Users/josh.lang/Library/Logs/CoreSimulator/3BB4CBFB-5A67-4E93-91B5-78E6E3658A16/system.log

它將保留所有,但我注意到如果我在運行時打開它,它也會自行重新加載。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM