分段错误回溯到vfprintf?

时间:2012-02-25 11:05:41

标签: c file-io gdb segmentation-fault

我遇到分段错误并使用gdb和backtrace,它被引发到vprintf。

#0  0x006e8779 in vfprintf () from /lib/libc.so.6
#1  0x006f265f in fprintf () from /lib/libc.so.6
#2  0x08049fd1 in write_tofile (logfile=0x9843090 "~/www/log") at example.c:446

当我致电

时会发生这种情况
file = fopen(log_file, "a"); // log_file = "~/www/log"
fprintf(file, buffer);

可以fopen处理来自不同目录的文件吗?有人会有一个线索,为什么它会在这里发生错误?

4 个答案:

答案 0 :(得分:6)

使用' ~'作为主目录的缩写是一个shell的东西,并且不一定在C中可用。这可能会导致fopen失败,并且您不会检查返回代码。 / p>

答案 1 :(得分:2)

您必须从不无法检查不受您控制的100%操作中的错误。如果您不知道文件是否存在且打开操作是否必须成功(这是您确实无法确定的事情),那么您必须测试:

FILE * f = fopen(log_file, "a");

if (!f) { /*error, die? */ }

fprintf(f, buffer);

还要确保buffer是指向以null结尾的字符数组的第一个字符的有效指针,并且该字符串不包含任何格式说明符。

仅打印原始字符串str,如果必须,可以更安全地使用fputs(str, f)fprintf(f, "%s", str)

答案 2 :(得分:0)

检查缓冲区的内容。您有未转义的%符号和/或没有空终止字符。

答案 3 :(得分:0)

据推测fopen失败&返回NULL指针。

您应该在使用之前检查fopen的返回值,并使用errno来确定错误是什么。