2012-02-25 61 views
2

我得到一個分段錯誤,並使用gdb和backtrace,它被引發到vprintf。分割故障回溯到vfprintf?

#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從不同的目錄中處理文件?會有人知道爲什麼它會在這裏發生故障嗎?

回答

6

使用'~'作爲您的主目錄的縮寫是shell的東西,並不一定在C中可用。這可能會導致fopen失敗,並且您不檢查返回碼。

0

檢查緩衝區的內容。您有一個未轉義的%符號和/或沒有空終止字符。

0

大概fopen失敗&返回一個NULL指針。

在使用前您應該檢查返回值fopen,並使用errno來確定錯誤是什麼。

2

您必須從不未能檢查在您的控制下不是100%的操作中的錯誤。如果您不知道文件是否存在,並打開操作必須成功(這件事情你真的不能肯定知道,曾經),您必須測試:

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

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

fprintf(f, buffer); 

另外,還要確保buffer是一個有效的指針到以空字符結尾的數組的第一個字符,並且該字符串不包含任何格式說明符。

對於僅打印原始字符串str,如果必須使用fputs(str, f)fprintf(f, "%s", str)更安全。