
昨日「windowsプログラムのデバッグ」で投稿させて頂いた者です。
要点は「どのようなときにfcloseがエラーをおこすか」です。
Windowsプログラムでバグを探したところデバッグ用のログ出力ファイルを
fcloseする時にエラーがおこりプログラムがエラーを起こして終了している
ことがわかりました。
プログラムを実行させて一定操作を行うと、プログラムの最後に行われるfcloseでエラーが起こります。
プログラムを実行させてそのまま(×等で)終了させたときにはエラーが起こらずに正常な書き込みがされているので、
メッセージの処理等をしている間に変な処理を入れてしまているのだと思いますが、
実際にログファイルへの書き込みはfcloseの直前までできているのでなぜエラーが起こるのかよくわかりません。
if((fp=fopen("log.txt","w")==NULL)return -1;
とやっているのでfopenは成功していると思います。
fcloseがエラーとなるのはどのような原因が考えられるのでしょうか。
「意味がわからないので~を説明しろ」等でも構いませんのでご回答お願いいたします。
【環境】
VC6.0++ProffessionalEdition
windows2000
【その他】
-エラー文の内容-
"0x77fcc465"の命令が"0xfffdfffa"のメモリを参照しました。
メモリが"read"になることはできませんでした。
No.1ベストアンサー
- 回答日時:
こんにちわ。
一つ確認させて下さい。
fclose の直後に、別の処理を追加してみて下さい。
→ 別のファイルにログを採取するようなものだけで結構です。
これで、log.txtのfclose が正常に動作するようであれば、
スタックを壊してしまっているために、異常なリターンアドレスに
復帰しようとした可能性が高いです。
→ 獲得したローカル変数に領域を越えてデータを読み込んで
しまった時等に、このようなエラーが発生する事があります。
(fclose の問題ではなく、呼び出し元の関数に復帰する時に
エラーとなった事が考えられます。)
スタック破壊の場合、問題の関数内の処理の一部をコメントアウトして、
エラーが発生するかどうかを調べると、比較的容易に問題の箇所を
特定できると思います。
この回答への補足
すみません。別の箇所でバグが発生してしまい
今確認ができない状態です。
申し訳ございません。
確認が済み次第お礼の欄に書かせて頂きます。
なお別のバグに関する質問を投稿させて頂きます。
よろしくお願いいたします。
No.3
- 回答日時:
>fclose((_iobuf *)0xffdffee));という事でしょうか。
ということです。
どんな引数を与えると、そのエラーが出るのか?を試した結果です。
ただ確認しただけで、あまり意味はありません。
さらに質問です。
・ちなみに、そのファイル処理は、一つの関数の中で完結していますか?
・それとも、ログファイル用のクラスがあって、そのコンストラクタ、デストラクタで、ファイルのオープン・クローズを処理していたりしませんか?
もし、後者の場合、クラスのコピーを考慮しないと、コピーのデストラクタで、ファイルがクローズされてしまい、オリジナルのデストラクタでの処理がエラーになる事があります。この場合、参照カウンタや、コピーフラグなどをクラスに持たせて、最後のインスタンス、もしくはオリジナルのみが、ファイルのクローズを行うようにする必要があります。
はずしていたら、ごめんなさい。
大変遅くなって申し訳ありません。
質問についてはちゃんと正しく処理がされていることを確認いたしました。
途中の箇所の修正をしているうちにこのバグにたどりつけなくなってしまった為返事が遅れてしまいました。
現在、ほとんど動くようになったのですがどうやらこのバグは発生しなくなりました。
どこかでミスってたのかもしれません。すみません・・。
だいぶ進んできたのですが更に謎のバグが発生したので更に投稿させて頂きます。
ありがとうございました。
No.2
- 回答日時:
ファイルポインタがどこかで書き変わってしまっていませんか?
もしくは、違うファイルポインタだったとか。
もしくは、別の場所で、すでに1度閉じられていたとか。
もしくは、ポインタをずらしてしまったとか。
あまり役に立つ情報ではありませんが、fclose()に、(_iobuf *)0xfffdffeeを引数として与えると、...が "0xfffdfffa"のメモリを参照... というエラーがでました。
この回答への補足
回答と質問ありがとうございます。
ファイルポインタは一つのみ。
fopen、fcloseともに一つずつです。
fprintf以外でファイルポインタの使用はしておりません。
おそらく以上の条件からこの点に置いてもんだいはないと
おもいます。ありがとうございます。
(_iobuf *)oxfffdffeeというのが何かわからないので
申し訳ございませんが説明をお願いいたします。
fclose((_iobuf *)0xffdffee));という事でしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで質問です。 ハイパー...
-
Returnに対するGoSubがありません
-
「パス名が無効です」の発生原因
-
FileSearchがExcel2010でできない
-
VBから参照できないCのDLLを使...
-
VB6 Dir関数で52エラー発生
-
Access2013にてドラッグ&ドロ...
-
ネットワーク上でのファイル操...
-
gccを行ってもexeファイルが生...
-
matlabでexcelを閉じる
-
インデックスが配列の境界外で...
-
VBでファイルが開かれているか...
-
access テキストボックスの値取得
-
fcloseで発生するエラーについて。
-
ファイルをクローズしたい
-
【関数】同じ関数なのに、エラ...
-
AutoExecで自動終了させるには?
-
アクセスのクエリでコンパイル...
-
csvファイルをvbaで読み...
-
【COBOL】read文でエラー
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで質問です。 ハイパー...
-
Excel 2003 のエラーメッセージ
-
「パス名が無効です」の発生原因
-
PowerShellを使って関連付けら...
-
access テキストボックスの値取得
-
【COBOL】read文でエラー
-
アクセスのクエリでコンパイル...
-
Returnに対するGoSubがありません
-
batファイルでレジストリキーの...
-
VBから参照できないCのDLLを使...
-
NAS上のファイルの使用中が解除...
-
データベースソフトのアクセス2...
-
VB6 Dir関数で52エラー発生
-
【関数】同じ関数なのに、エラ...
-
gccを行ってもexeファイルが生...
-
FORTRANの実行エラーについて
-
FTPの送信結果を検知したい
-
fgets関数のEOFの扱い方について
-
ASP.NET 2.0にてアプリが動作し...
-
VBでファイルが開かれているか...
おすすめ情報