【问题标题】:Why doesn't fprintf(outputFile,"") work from inside gdb? [closed]为什么 fprintf(outputFile,"") 不能在 gdb 内部工作? [关闭]
【发布时间】:2021-09-25 23:05:15
【问题描述】:

当我尝试从 gdb 内部调试一段代码并且控件到达 outputFile 的 fprintf 语句时,它不会在文件中生动地显示输出并且它只是显示为空,尽管只需一个从终端简单运行程序。

从 gdb 内部调试时,如何在 outputFile 上获得生动的输出?

注意:我不是在谈论 gdb,我只是在问如何在从 gdb 调试时动态地在文件中获得输出。

【问题讨论】:

  • 不要解释你的代码——那几乎没用。发布您的代码、您获得的输出以及您期望的输出。
  • 默认情况下,连接到常规文件的流是块缓冲的,因此您写入的数据不会被传递到文件,直到(i)您填满缓冲区,(ii)您 @987654323 @ 流,或者 (iii) 您通过 fclose() 或通过正常的程序终止干净地关闭文件。
  • @AndrewHenle 我不是在谈论任何特定的代码,我是在谈论 gdb 的一般行为以及任何 fprintf 语句,直到程序完全终止或我需要它时输出才会显示保持活力,所以我希望我不需要放一段只包含一个 fprintf 语句的代码来表达我的观点
  • 该行为与gdb 没有特别关联。只是您使用gdb 将程序执行暂停在您可以轻松观察缓冲效果的位置。
  • @Susano 在宇宙中如何讨论“gdb 的一般行为”以任何方式有用when the PDF user manual for gdb is 890 pages???这不是讨论网站...

标签: c file gdb


【解决方案1】:

从 gdb 内部调试时,如何在 outputFile 上获得生动的输出?

这样做:

(gdb) call fflush(0)

这将导致被调试程序刷新其所有输出流。

【讨论】:

  • 我在得到@stfwn 的回答后这样做了,所以谢谢,但只是为了添加我的 gdb,在这样做时要求返回类型转换。所以更完整的答案应该是 (int) fflush(fd)
【解决方案2】:

这可能是由于stream buffering

写入流的字符通常会累积并异步传输到块中的文件中,而不是在应用程序输出后立即出现。类似地,流通常以块的形式而不是逐个字符地从主机环境中检索输入。这称为缓冲。

试试这个例子:

#include <stdio.h>

int main(void) {
    FILE *f = fopen("foo.txt", "w");
    printf("Break here and go line by line.");
    fprintf(f, "Bar\n");
    printf("Nothing in foo.txt yet.");
    fflush(f);
    printf("Buffer has been written to foo.txt now.");
    fprintf(f, "Baz\n");
    printf("Baz is still only in the buffer.");
    fclose(f);
    printf("The buffer was written to the file before closing.");
}

【讨论】:

  • 这个答案正确解释了为什么没有输出,但根本没有回答“我怎么能”的问题。 比到处撒fflush()更好的答案。
猜你喜欢
  • 1970-01-01
  • 2015-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-08
  • 2021-04-01
  • 2019-12-25
  • 1970-01-01
相关资源
最近更新 更多