如何在应用程序运行时获取控制台输出?

13

为了调试目的,我想在运行时以类似于App Store上当前Console应用程序(可以在这里找到)的方式访问控制台打印输出。

我查看了文档,但是没有发现苹果提供的内容,但感觉自己缺少重要的东西。有什么见解吗?

谢谢。

2个回答

19
你可以使用<asl.h>来实现。以下是一个我编写的示例,用于创建控制台消息数组。
-(NSArray*)console
{
    NSMutableArray *consoleLog = [NSMutableArray array];

    aslclient client = asl_open(NULL, NULL, ASL_OPT_STDERR);

    aslmsg query = asl_new(ASL_TYPE_QUERY);
    asl_set_query(query, ASL_KEY_MSG, NULL, ASL_QUERY_OP_NOT_EQUAL);
    aslresponse response = asl_search(client, query);

    asl_free(query);

    aslmsg message;
    while((message = asl_next(response)) != NULL)
    {
        const char *msg = asl_get(message, ASL_KEY_MSG);
        [consoleLog addObject:[NSString stringWithCString:msg encoding:NSUTF8StringEncoding]];
    }
    if (message != NULL) {
        asl_free(message);
    }
    asl_free(response);
    asl_close(client);

    return consoleLog;
}

虽然控制台应用程序已经进入应用商店,但我不能保证未来使用“asl”的应用程序也能进入。 - Joe
我明白。这仅用于调试,因此将被有意地从生产级别的代码中剥离。 - Hyperbole
那么就使用它吧,它会传递消息,你也可以使用set_query按严重程度、时间等进行过滤,并且你可以使用asl_get获取其他值,如严重程度、时间等。 - Joe
3
发现一则有趣的笔记,针对IOS开发人员。设备上的ASL实现将限制您仅搜索最近的256条消息。当心这一点。 - martyman
1
Marty...你必须自己限制查询吗?我偶尔在使用ASL读取时会崩溃,但不确定原因是什么。 - Bob Spryn
@BobSpryn 目前没有参数来限制查询返回的结果数量。请谷歌“asl manpage”以阅读最新文档,因为这可能会更改。我也观察到在使用上面的代码片段时会崩溃,但我已经编辑了它以包括修复内存泄漏的解决方法(如果不是NULL,则必须释放aslmsg消息),这似乎已经解决了崩溃问题。 - sja26

0

如果您的设备连接到Xcode,您可以在调试区域中看到控制台输出(例如NSLog):

如果您正在运行应用程序并稍后连接到Xcode,则可以在组织者中获取控制台日志。


编辑:要在运行时访问日志文件,您应该尝试使用 /var/log/system.log —— 但更好的建议是使用自定义调试函数,它将写入系统日志和/或您的应用程序中的文本视图。 (查看 NSLogv,在编写包装函数时将非常有用。)这还具有让您从一个地方禁用所有调试日志的优点(只需更改调试函数即可)。


谢谢你的回答,但是我说的是在应用程序运行时访问控制台输出,就像我在问题中链接的Console应用程序一样。 - Hyperbole
每个人都应该知道如何在xCode中使用调试日志。 - Alex Cio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接