【问题标题】:Printf() before line causing segmentation fault does not execute [duplicate]导致分段错误的行之前的Printf()不执行[重复]
【发布时间】:2011-10-23 11:06:08
【问题描述】:

发生分段错误时,之前的printf()不执行。

main()
{
 printf( "something" );
 statement;  //this statement causes a segmentation fault
}

在上述情况下,为什么 printf() 没有执行?

在这种情况下我是否需要使用 valgrind(在错误语句之前打印所有 printf())。

【问题讨论】:

    标签: c gcc


    【解决方案1】:

    确保在 printf 语句中包含换行符 "\n"。通常,至少在 UNIX 系统中,stdout 是行缓冲的,因此换行符使该行立即出现。您可能省略了"\n"(或者您的输出由于其他原因未刷新),这就是您看不到打印字符串的原因。

    另一种选择是在调用printf 之后使用fflush(stdout) 自己刷新输出。

    【讨论】:

    • 它适用于行缓冲输出
    • @Mr.32 -- 如果将输出重定向到文件,则行缓冲技巧将不起作用。只需使用 fflush() - 它是可移植且一致的。
    【解决方案2】:

    在程序崩溃之前输出流可能无法输出,但您可以通过使用 fflush() 刷新字节来强制输出字节。

    我通常这样做:

    if (trace) { fflush(stdout); }
    

    【讨论】:

    • "trace" 有什么特别的 ..??或者你刚刚用来检测分段错误。?
    • @Mr.32 -- 我把他的trace 作为他在初始化期间设置的变量,可能来自命令行选项。
    • 或者,fprintfstderr
    • @DavidThornley 不,虽然发送到 stderr 是一件好事,但它仍然会被赶上并且可能不会发送出去; flush 所做的是告诉系统刷新挂起的写入 - 完成它们!因此,从 fprintf 到 stderr 的行为与之前的调用相同。
    • stderr 默认情况下是无缓冲的,即使重定向到文件也是如此。它在任何 IO 调用后都不需要手动刷新。
    【解决方案3】:

    通过printf() 和任何其他标准 I/O 函数的输出在标准 C 库中缓冲。

    您需要调用 fflush() 以确保在程序崩溃之前将输出发送到 tty。

    【讨论】:

    • 有趣的未注释-1,某人。
    猜你喜欢
    • 2012-03-17
    • 1970-01-01
    • 2015-09-03
    • 2021-11-06
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多