2011-09-15 43 views
0

オープンした出力ファイルにバッファを書き込もうとするCコードがあります。コードを実行しようとするとセグメンテーションフォルトが発生します。Linuxでfwriteのsegfault

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

ヘッダが適切に人口があると私は、バッファヘッダーのheader.theサイズの内容をプリントアウトすることができています間違いなくそこrecord_size.Is checking.?Any他の理由で価値が何よりも大きいですfwriteのはsegfault.Gdbing問題は、出力ファイルは、これまでcreated.howされていないと私のディレクトリのls -lでは、サイズ0の出力ファイルが表示されていることを示唆しているようだ次の出力

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 

を与え引き起こす可能性があります場所バイト。

誰かが問題に懐疑的になることができたら大変感謝します。

EDIT:コードファイルを開きます。

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); if(outfd == -1) { dagutil_panic( "書き込みに%sを開くことができませんでした。\ n"、out); } uOutfile = fdopen(outfd、 "w"); – liv2hak

+0

"出力ファイルが作成されていないことを示唆しているようです"←それについては確かですか? 'gdb'があなたのソースコードを見つけることができないことを私に示唆しています - あなたが.cファイルを出力していない限り。 – Thanatos

答えて

1

私はあなたの問題が何であるかを確実に知るためにここに十分にあると思うが、ここではいくつかの考えているしないでください。

  • たちを表示しますFILE *uOutFile)とあなたのバッファ(header)を含むコードを見れば、あなたはどこかの間でメモリをボルキングしているかどうかを知ることができます。
  • valgrindでコードを実行する:あなたはsegfaultを取得しているので、間違っていることをおそらく捕らえることができます。 gdb
  • 、(だけではなく、ポインタが、尖った・ツー・メモリ。)headeruOutFileの両方の内容を調べる(あなたはuOutFileが右に見えるかどうかを把握するためにいくつかの知性を使用する必要がありますが、あなたはする必要がありますheaderが正しいかどうかのアップまたはダウンすることができるかを決定)

これに追加するには、次の。私の一般的なデバッグ戦略を私はセグメンテーション違反を得るときである:

  1. gdbのバックトレース。私に言うセグメンテーションが起こったところ。通常、これは私がしたばかげたことを明らかにするのに十分です。
  2. クラッシュの勢いのポインタを見てください。ポインタが正しいか、指し示されたデータが正しいか? (ESP。あなたは0xdeadbeefのような奇妙なものを見る場合)
  3. ValgrindのValgrindのValgrindの

(2 & 3は順不同である。)