【问题标题】:printf() intermittently ceasing to print during debugging in Xcode 4在 Xcode 4 中调试期间 printf() 间歇性地停止打印
【发布时间】:2011-03-12 22:44:18
【问题描述】:

我刚刚升级到 Xcode 4 并且正在从事 C++ 项目。我发现 printf() 间歇性地无法完成到 Xcode 控制台的打印(中线),并且从那里 printf() 停止打印任何东西 - 即使应用程序继续在调试器中运行。

我怀疑 Xcode 4 的控制台窗口有问题,因为如果我将 stdout 重定向到文件,那么日志记录似乎会继续进行而没有任何问题。也就是说,如果我在命令行上使用以下内容:

tail -f log-out.txt

然后有时会显示不完整的行。但这可能是由于某种缓冲(不完全刷新),因为最终文件中的行是完整的。

所以,我想知道是否有人经历过这样的事情并了解导致 Xcode 控制台输出冻结的原因。

【问题讨论】:

  • 是的,我不时在 Xcode 3 中看到类似的东西。我不知道有什么解决办法。

标签: c++ debugging printf stdout xcode4


【解决方案1】:

从未真正使用过 Xcode,但是:

你能告诉我们你的 printf 调用是什么样子的吗?

我问的原因是,如果您不刷新流,某些输出可能无法到达控制台(正如您在问题中实际指出的那样)。最简单的方法是在每个 printf 调用的末尾添加一个换行符。

【讨论】:

  • 最有可能打印不完整的 printf() 行都以 '\n' 结尾。我在其他 SO 帖子中读到 newline => flush 可能是由控制台中的特殊行为引起的。使用tail,我看到打印了部分行,并怀疑流的缓冲区大小导致了这一点——而不是换行符的存在。但这只是猜测。
  • 这不会导致缓冲区溢出 => 堆栈损坏 => 至少在调试模式下应该抛出异常?如果没有,您可以执行以下操作:查看输出被截断的近似长度,然后使用更大的字符串对 printf 运行两次或多次调用。在它们之间手动刷新流(fflush(NULL);我认为)。如果它是缓冲区,您应该在同一位置截断所有输出行。您是否尝试过在另一个编译器上为 printf 使用相同的参数?
  • 我认为我遇到的实际上是 Xcode 中的一个错误。我不是随便说的。但考虑到通过将标准输出重定向到文件我不再看到这种类似冻结的行为这一事实,我不得不假设问题不在于流式传输或缓冲本身。我将 printf() 用于调试目的,所以对我来说输出结束的位置并不重要。在某些方面,流式传输到文件更好。至于缓冲区溢出,我根本不建议这样做。流通常会在缓冲区已满时实现刷新 - 这可能是我在文件流中看到的。
  • 抱歉,我无法提供更多帮助。
【解决方案2】:

这种行为似乎是间歇性的,据报道 Xcode 4 已经存在。作为一种变通方法,我对 main() 函数做了类似的事情。当 Xcode 的 Debug Console 行为不端时,这种方法有一些优势。

#define REDIRECT_STDOUT_TO_FILE 1

int main(int argc, char ** argv)
{
#if REDIRECT_STDOUT_TO_FILE //## redirect stdout to "log-out.txt"
    freopen("log-out.txt", "w", stdout);
#endif  //  REDIRECT_STDOUT_TO_FILE

    MyApp app(argc, argv);

    int result = app.Run();

#if REDIRECT_STDOUT_TO_FILE //## redirect stdout to "log-out.txt"
    fflush(stdout);
    fclose(stdout);
#endif  //  REDIRECT_STDOUT_TO_FILE

    return result;
}

在终端中使用 tail -f log-out.txt 可以查看标准输出。或者,如果您使用 BBEdit,bbedit --new-window log-out.txt 也是一个可行的解决方案。

目前,我认为这是 Xcode 中的一个错误 - 我将继续尝试了解它是在什么条件下发生的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多