来自 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);
【讨论】:
tryfprintf(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
【讨论】:
以上是关于来自 C 代码的 NSLog 样式调试消息的主要内容,如果未能解决你的问题,请参考以下文章
CSS开发者调试工具 ( 打开工具 | 设置工具显示位置 | 选择元素 | 查看手机版样式 | 开发者调试工具缩放 | 修改数值大小调试 | 查看 CSS 样式代码位置 )