来自 C 代码的 NSLog 样式调试消息

Posted

技术标签:

【中文标题】来自 C 代码的 NSLog 样式调试消息【英文标题】:NSLog style debug messages from C code 【发布时间】: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 的任何工作都感到惊讶。 【参考方案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

【讨论】:

以上是关于来自 C 代码的 NSLog 样式调试消息的主要内容,如果未能解决你的问题,请参考以下文章

CSS开发者调试工具 ( 打开工具 | 设置工具显示位置 | 选择元素 | 查看手机版样式 | 开发者调试工具缩放 | 修改数值大小调试 | 查看 CSS 样式代码位置 )

css:chorm调试工具(修改样式重置缩放比例错误提示)

css:chorm调试工具(修改样式重置缩放比例错误提示)

前端样式脚本本地化开发

chrome调试工具

给 console 添加颜色