【发布时间】:2011-10-23 11:06:08
【问题描述】:
发生分段错误时,之前的printf()不执行。
main()
{
printf( "something" );
statement; //this statement causes a segmentation fault
}
在上述情况下,为什么 printf() 没有执行?
在这种情况下我是否需要使用 valgrind(在错误语句之前打印所有 printf())。
【问题讨论】:
发生分段错误时,之前的printf()不执行。
main()
{
printf( "something" );
statement; //this statement causes a segmentation fault
}
在上述情况下,为什么 printf() 没有执行?
在这种情况下我是否需要使用 valgrind(在错误语句之前打印所有 printf())。
【问题讨论】:
确保在 printf 语句中包含换行符 "\n"。通常,至少在 UNIX 系统中,stdout 是行缓冲的,因此换行符使该行立即出现。您可能省略了"\n"(或者您的输出由于其他原因未刷新),这就是您看不到打印字符串的原因。
另一种选择是在调用printf 之后使用fflush(stdout) 自己刷新输出。
【讨论】:
在程序崩溃之前输出流可能无法输出,但您可以通过使用 fflush() 刷新字节来强制输出字节。
我通常这样做:
if (trace) { fflush(stdout); }
【讨论】:
trace 作为他在初始化期间设置的变量,可能来自命令行选项。
fprintf 到 stderr。
stderr 默认情况下是无缓冲的,即使重定向到文件也是如此。它在任何 IO 调用后都不需要手动刷新。
通过printf() 和任何其他标准 I/O 函数的输出在标准 C 库中缓冲。
您需要调用 fflush() 以确保在程序崩溃之前将输出发送到 tty。
【讨论】: