2011-09-15 104 views
0

我有一段C代碼,我嘗試在打開的輸出文件中寫入一個緩衝區。當我嘗試運行代碼時出現分段錯誤。Linux上的fwrite中的段錯誤

if (fwrite(header, record_size, 1, uOutfile) != 1) 
{ 
    return 0; 
} 

頭是一個正確填充,我能夠打印出緩衝區頭的header.the大小的內容肯定比record_size.Is還有什麼值得checking.?Any其他更大的原因其中FWRITE可引起segfault.Gdbing問題給出了下面的輸出

0x00007ffff6b7d66d in _IO_fwrite (buf=0x726d60, size=16, count=1, fp=0x738820) at iofwrite.c:43 
43 iofwrite.c: No such file or directory. 
    in iofwrite.c 

這似乎表明,輸出文件一直沒有created.how曾經和ls -l命令在我的目錄顯示大小爲0的輸出文件字節。

如果有人能夠解決這個問題,我將不勝感激。

編輯:打開的文件編號:

outfd = open(out, O_RDWR|O_CREAT|O_TRUNC|O_LARGEFILE, 0664); 
if (outfd == -1) { 
    dagutil_panic("Could not open %s for writing.\n", out); 
} 
uOutfile = fdopen(outfd, "w"); 
+0

請添加打開的文件的代碼。 –

+0

outfd = open(out,O_RDWR | O_CREAT | O_TRUNC | O_LARGEFILE,0664); (outfd == -1) { dagutil_panic(「無法打開%s寫入。\ n」,out); } uOutfile = fdopen(outfd,「w」); – liv2hak

+0

「似乎表明輸出文件尚未創建」←你確定嗎?它暗示我'gdb'找不到你的源代碼 - 除非你輸出一個.c文件。 – Thanatos

回答

1

我不認爲有足夠的在這裏肯定知道你的問題是什麼,但這裏有一些想法:

  • 顯示我們涉及您的FILE *uOutFile)和您的緩衝區(header)的代碼 - 我們可以看到您是否正在記憶之間的某處。
  • 通過valgrind運行你的代碼:你得到一個段錯誤,所以它可能會抓住你做錯了什麼。
  • gdb,檢查內容headeruOutFile(不只是指針,但指向內存。)(你將不得不用一些智慧來確定uOutFile看起來是否正確,但你應該能夠向上或向下確定是否header是正確的)

要添加到這一點:我一般調試策略時,我得到段錯誤是:

  1. gdb的回溯。告訴我其中發生段錯誤。通常,這足以發現我所做的愚蠢的事情。
  2. 看看碰撞的正面的指針。指針是否正確,並且是指向正確的數據? (特別是如果你看到一些奇怪的像0xdeadbeef
  3. Valgrind的Valgrind的Valgrind的

(2 & 3是在沒有特定的順序。)