【问题标题】:printf statements not showing upprintf 语句未显示
【发布时间】:2012-11-09 03:59:07
【问题描述】:

我正在使用 Microsoft Visual C++ 6.0 并尝试调试其他人的程序。我尝试使用 printf 语句,但由于某种原因,这些语句在程序运行时没有显示在屏幕上。我可以使用 fprintf 将这些语句打印到文件中,但是当程序在执行过程中崩溃时这是无用的,因为那时文件将是空的。

如何强制某些输出显示在屏幕上?

【问题讨论】:

  • 这个项目是控制台应用程序还是 GUI 应用程序?除非创建控制台窗口,否则printf 不起作用。
  • 这是一个控制台应用程序。 MS-DOS/cmd 屏幕上什么都没有显示。
  • 尝试使用fprintf()stderr
  • 当程序崩溃时,使用调试器是无价的!当程序崩溃时,实际上应该是您在调试器中运行它的第一反应。它将向您显示在哪里崩溃,显示堆栈跟踪以便您了解函数调用堆栈,并让您检查变量以帮助您了解它可能崩溃的原因。至于printf的输出没有显示,在文本后面加一个换行符,或者调用fflush(stdout)刷新输出。
  • 另外,由于您有两个问题,您可能应该将其发布为两个问题:一个用于输出问题(本应作为副本关闭);还有一个用于崩溃问题,以及相关代码。

标签: visual-c++ printf


【解决方案1】:

要强制输出到屏幕,请参阅下面的第一部分。下面的第二个和第三个选项也适用于调试此类程序崩溃。

将 printf 与 fflush 结合使用(改进 Vishal Kumar 的答案)

Vishal Kumar 的回答对我有用,但我必须做一些研究才能了解如何使用 fflush。我遇到了一个问题,我的程序在没有意义的 printf 语句“中间”崩溃了。这是我对他的回答的改进。在调试器难以使用的情况下(例如多线程),您可以在每个 printf(或 fprintf)语句之后使用 fflush。例如,“给你的代码加分”:

... // code
printf("Part 1 executed successfully");
fflush(stdout); // flushes the stdout buffer
... // further code
printf("Part 2 executed successfully");
fflush(stdout);
... // repeat as necessary

运行,观察输出,并在最后一个打印的语句和第一个不打印的语句之间放置更多的打印语句,直到找出问题为止。

调试器

如果您能够使用调试器,那么它是一种比在代码中添加上述输出语句更有效的选择,但在某些情况下您必须求助于它。

Valgrind

如果您使用的是 Linux(我猜您不是因为它在 MS Visual C++ 中),valgrind 是查看代码崩溃位置(以及检测内存泄漏)的另一种选择。如果你的代码是为调试而编译的,如果你的程序被称为“myProgram”,你可以从终端窗口调用如下:

valgrind myProgram

【讨论】:

  • 谢谢!它确实有助于在终端上看到打印语句。强制输出到屏幕有时会让我们在修复损坏的代码方面变得轻松。
  • @Sarvesh Pandey 很高兴它有用!