【问题标题】:Debug & run result differ in simple c app that redirects stdout using freopen使用 freopen 重定向标准输出的简单 c 应用程序中的调试和运行结果不同
【发布时间】:2022-01-31 11:39:49
【问题描述】:

我正在使用 linux manjaro。我有以下代码(cons.c)

#include <stdio.h>
#include <stdlib.h>
int main()
{
    FILE *f=freopen("/dev/null", "a", stdout); //redirect stdout to /dev/null
    FILE *g=freopen ("/dev/tty", "a", stdout); // redirect stdout back to console
    printf("%p %p\n",f,g);
    return 1;
}

我执行了以下操作并得到了预期的结果

[tom@sp4 src]$ gcc -g cons.c -o cons
[tom@sp4 src]$ ./cons
0x7f19897b7520 0x7f19897b7520

当我在底线设置断点并使用 VS Code 交互式调试器进行调试时,g 返回 null 而 printf 什么也不做。

【问题讨论】:

  • void main() 不是托管实现上 C main() 函数的一致签名。 main() 应该返回 int。但是,这不太可能是您的问题的根源。
  • 我无法重现您描述的行为。对我来说,你的程序总是打印“0 256 0”,无论是直接运行还是从 gdb 运行,无论是否设置了断点。这是我所期望的。
  • @John Bollinger 谢谢。 int main() 没有任何区别。我在 vs 代码终端中运行它。怀疑这也会有所作为。
  • 实际上,在 VS Code 命令窗口中运行它正是可能导致此类问题的类型。尝试打开一个真正的终端窗口,与 VS Code 分开,并在那里运行您的可执行文件。
  • 您没有测试您的freopen() 调用的返回值,因此您不知道它们是否成功。未能检查函数调用的返回值通常是一个错误,我怀疑它在这里咬了你。您描述的行为与第二次 freopen() 调用失败是一致的,并且您在 VS Code 中运行程序这一事实是一个合理的解释。

标签: c system stdout freopen


【解决方案1】:

问题在于 VS Code 中的交互式调试器。在 VS Code 终端中使用 gdb 进行调试时,它工作正常。在 VS 代码中使用交互式调试器时,第二次重新打开返回 null。感谢约翰·博林格。

【讨论】:

    猜你喜欢
    • 2013-10-20
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 2013-05-03
    • 2011-01-06
    相关资源
    最近更新 更多