私は(学習課題など)のncursesと小さなコンソールゲームを書いているにセグメンテーションフォールトが発生し、私はすでにいくつかのマイナーな問題を持っていましたCでは)、本当のショーストッパは決してなかった。しかし、「未来のための準備」として、私は初歩的なデバッグログファイルを実装したいと思っていました。そして、これは物事が奇妙な行動を起こし始めるところです。fprintfのは、急激な住所変更
ログファイルには、()エラーのいずれかの証拠を示さない(+モードwを使用して)とferror()はfopen、グローバルに宣言されています。代わりにすべてが完璧に動作するように見え、ログファイルが作成され、情報が書き込まれます。しかし、いくつかのデバッグ出力をさまざまな関数に追加した後は、ゲームは単なるsegfaultです。 consquenceとして、私は、ファイルにほぼすべてのデバッグ出力をコメントアウトしました、そして今、このコードのシンプルなラインは、ゲーム全体をクラッシュ:
fprintf(debuglog, "loop_game()\n\tTime's over! Returning 0\n");
私は、GDBを使用してプログラムを実行し、フル BT ました次の出力:
#0 0x00007ffff7886f24 in fwrite() from /lib/libc.so.6
No symbol table info available.
#1 0x000000000040224f in loop_game (pl=0x62d800, list_win=0x62f930,
timer=0x632620, list_ob=0x632640) at game.c:207
elapsed = 60
#2 0x0000000000402d53 in main() at main.c:62
pl = 0x62d800
list_win = 0x62f930
timer = 0x632620
list_ob = 0x632640
(game.c:207私は先に言及したラインである)また、誰かが私は DEBUGLOG 時計を使用する必要があり、その出力は、次のされた私に言った:
012 (これは、ゲームが正常に終了する必要が後の時間である)60秒後に、その後Old value = (FILE *) 0x62f6f0
New value = (FILE *) 0x20062f6f0
move_obstacle (win_game=0x62f970, target_ob=0x63ce00) at game.c:370
370 wrefresh(win_game);
そして、:
その後、私が使用したを継続し、約10秒後に、それはこれらの行をプリントアウト、ゲームのsegfaults。ウォッチポイントとしてDEBUGLOGでGDBを使用したとき時にはそれがまた
Old value = (FILE *) 0x22f6f0
New value = (FILE *) 0x0
または0x2のの代わりに、0x0のを出力します。私はすでにSIGABRTを持っています。
私は初心者なので、次に何をすべきか分かりません。私はすでに幅広い知識を持っている人たちを尋ねましたが、「すべての悪の根源」を見つけることができませんでした。コードが必要な場合は、hereがあります。私はそれはあなたがそれの上に書いている可能性があります
1バイトが上書きされている可能性が高くなります。 'debuglog'の値は' 0x00062f6f0'から '0x20062f6f0'に変わります。 (0x20がASCIIの空白文字*であるという事実は手がかりかもしれません) –
...私は解決策を見つけました。私はそれを許可されたらすぐに投稿します:) –