【问题标题】:NSLog style debug messages from C code来自 C 代码的 NSLog 样式调试消息
【发布时间】:2011-12-04 01:10:13
【问题描述】:

我在一个静态库中有一些 C 代码,我正在编译到 iPhone 应用程序中。我想在控制台打印一些调试消息;我应该使用类似 NSLog 的东西吗?我猜 NSLog 只适用于程序的 Objective-C 部分。

编辑: fprintf(stdout, fmt...) 和 fprintf(stderr, fmt...) 也不起作用..知道为什么它们不起作用吗?他们应该工作吗?

【问题讨论】:

  • 普通的旧 printf 似乎适用于我正在处理的一些代码。
  • 所以我发现输出显示在 Xcode 的控制台中,而不是管理器中的控制台。我想这就是我所缺少的
  • 我从来没有完全弄清楚管理器中显示的内容。似乎随机选择行。
  • 我确定 fprintf 输出曾经显示在管理器控制台中。也许它与 Xcode 4.3 相关
  • 我对 Xcode 4 的任何工作都感到惊讶。

标签: iphone objective-c c ios


【解决方案1】:

你总是可以做经典:

fprintf(stderr, "hi, this is a log line: %s", aStringVariable);

【讨论】:

  • try fprintf(stdout,...); then... stderr 或 stdout 都是神奇的流标识符,它将导致输出出现在您的控制台中。
  • 是的,这两种方法都试过了,都没有奏效。我可以在相同的代码中设置断点,Xcode 调试器会在这些点中断.. 所以代码肯定在设备上运行。
  • 只是为了傻笑,尝试从终端运行您的应用程序,看看那里是否出现任何行。或者在 Console.app 中。
  • 这并没有什么帮助,因为我正在调试一些无法在 x86 上运行的 NEON 代码..
  • 是的...我将建议接下来在 XCode 中查看控制台。很高兴你知道了!
【解决方案2】:

如果你像这样混合 Objective-C 代码,你可以为 NSLog 做一个包装器:

log.h

void debug(const char *message, ...) __attribute__((format(printf, 1, 2)));

log.m

#import <Foundation/Foundation.h>
#import "log.h"

void debug(const char *message,...)
{
    va_list args;
    va_start(args, message);
    NSLog(@"%@",[[NSString alloc] initWithFormat:[NSString stringWithUTF8String:message] arguments:args]);
    va_end(args);
}

然后,在你的 C 文件中:

#include "log.h"
...
debug("hello world! variable: %d", num);

【讨论】:

    【解决方案3】:

    其他解决方案:

    #include <CoreFoundation/CoreFoundation.h>
    extern "C" void NSLog(CFStringRef format, ...);
    
    #define MyLog(fmt, ...) \
    { \
        NSLog(CFSTR(fmt), ##__VA_ARGS__); \
    }
    
    MyLog("val = %d, str = %s", 123, "abc");
    

    【讨论】:

    • 删除extern "C" 对我有用,让它编译和修复“错误:预期标识符或'('”
    【解决方案4】:

    如果您从 XCode 进行调试,会显​​示 printf,但它不会显示在 Organizer Console 中。你可以使用 NSLog 使用的:CFLog or syslog

    【讨论】:

    • CFLog 不是苹果专用的私有 API 吗?
    【解决方案5】:
    #include <asl.h>
    ...
    asl_log(NULL, NULL, ASL_LEVEL_ERR, "Hi There!");
    

    请注意,ASL_LEVEL_INFO 等较低优先级可能不会显示在控制台中。

    【讨论】:

      【解决方案6】:

      您应该能够看到 printf 或 fprintf 语句。尝试在库中运行一些代码,但从终端运行,如果没有,应该会出现一些东西。我向您保证可行的更复杂(甚至是愚蠢/愚蠢/错误)的方法是:

      sprintf(message,"This is a log line %s",someString);
      system("echo %s",message);
      

      如果这不起作用,那么您的代码中可能有一些奇怪的东西。

      注意:这可能只适用于模拟器。

      【讨论】:

        【解决方案7】:

        您可能需要使用 Apple System Log 工具将输出输入设备控制台。

        检查 usr/asl.h 中的函数。

        asl_open
        asl_new
        asl_set
        asl_log
        asl_free
        

        【讨论】:

          【解决方案8】:

          如果您从 XCode 进行调试,会显​​示 printf,但它不会显示在 Organizer Console 中。您可以运行以下命令以仅打印到设备的控制台:

          syslog(LOG_WARNING, "log string");
          

          您还需要#include 以显式声明 syslog 和 LOG_WARNING

          【讨论】:

            猜你喜欢
            • 2011-12-17
            • 2013-11-28
            • 2013-08-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-11
            • 1970-01-01
            相关资源
            最近更新 更多