【问题标题】:view file output while debugging调试时查看文件输出
【发布时间】:2011-08-22 08:58:41
【问题描述】:

在调试模式下将输出重定向到文件的问题是在程序完成之前我无法查看文件的内容(大小为零)。有了这个用法:

FILE *f;
f = fopen("log.txt", "w");
fprintf(f, "cycle =%d\n", c);

在调试时,我想在退出“fprintf”语句后立即查看文件中的轨道“cycle =”。

有什么办法吗?

【问题讨论】:

  • 您是否考虑过将输出打印到程序中的全局缓冲区并直接在调试器中查看缓冲区的内容?如果您有自己的日志记录功能,这会更好,因为您可以在记录到内存缓冲区和记录到带有一些预处理器条件(即#ifdef DEBUG)的日志文件之间切换。

标签: c debugging file


【解决方案1】:

虽然我在 C99 中看不到它,但 setlinebuf() 是一个在我需要它的任何 C 中都可用的函数。调用 setlinebuf() 在第一次输出到文件之前强制每个线路使用“线路缓冲”立即出去。

f = fopen("log.txt", "w"); 如果 ( !f ) 哎呀(); 如果(调试模式) setlinebuf( f );

无需单独调用 fflush()、fsync() 等。

请注意,这会减慢执行大量输出的程序,因此将其保留用于调试模式可能对某些程序的性能很重要。

如果你没有setlinebuf(),试试下面的,也就是C99:

 setvbuf(f, (char *)NULL, _IOLBF, 0);

【讨论】:

  • +1 for setvbuf()_IOLBF (这可能是最好的方法),但我建议使用 BUFSIZ 而不是 0 作为最后一个参数。这允许系统在它分配的缓冲区中一次缓冲一行。
【解决方案2】:

你可以尝试在fprintf()函数调用之后加上fflush(f);,这样可以立即写入数据。

【讨论】:

  • 与 fsync 有什么区别?
  • 每次 fflsush(f) 后,输出文件的内容都会被覆盖。我的意思是我看不到“cycle =1”“cycle =2”。只有我看到“循环= 2”。有什么想法吗?
  • 是否可以在打印周期计数之前重新打开文件?如果是这种情况,您应该以附加模式打开文件fopen("log.txt", "a+");
【解决方案3】:

使用fsync:

FILE *f;
f = fopen("log.txt", "w");
fprintf(f, "cycle =%d\n", c);
fsync(f);

【讨论】:

  • 每次 fflsush(f) 后,输出文件的内容都会被覆盖。我的意思是我看不到“cycle =1”“cycle =2”。只有我看到“循环= 2”。有什么想法吗?
  • 如果你想在日志文件末尾添加不同的执行,你需要以追加模式打开:fopen("log.txt", "a")。如果多个程序可以同时写入日志文件,不仅追加模式很重要,每次写入都必须以“\n”结尾,行不能太长,并且必须设置行缓冲(详见我的回答) 或者不同程序的输出可以交错在日志文件中。
【解决方案4】:

在调用 fprintf 后添加 fflush(f) 应确保输出对其他程序可见(尽管不一定写入磁盘)。

如果这是您不能或不想修改的代码,并且您正在使用 GDB 进行调试,您可以使用 call fflush(f) 让调试器为您调用 fflush。

【讨论】:

    【解决方案5】:

    看看这是否有帮助 - How to monitor log files in real-time?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-06
      • 2019-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-27
      • 1970-01-01
      • 2018-05-29
      相关资源
      最近更新 更多