2011-08-15 10 views
3

私は(学習課題など)の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があります。私はそれはあなたがそれの上に書いている可能性があります

答えて

8

...それは私が作っただけの愚かな過ちだ願っています。ここに私が意味するものがあります。 console.c

、あなたが持っているdebuglogを変更するラインで

int field[FIELDMAXX][FIELDMAXY]; 
FILE * debuglog; 

あります

field[target_ob->x_pos][target_ob->y_pos] = OBSTACLE; /* Changes debuglog. */ 

だから、値target_ob->x_postarget_ob->y_posは、あなたが期待していない何かをしている、かなり可能性がありますが。

ここで、最初に行うことは、これらの座標がどうなるかを調べることです()。もう1つは、別の方法でロギングを定義することです。個人的に私は別のロギング機能(vfprintfと呼ぶ)を使うと思いますが、私はdebugfileをいくつかのファイルに静的にします。

+1

1バイトが上書きされている可能性が高くなります。 'debuglog'の値は' 0x00062f6f0'から '0x20062f6f0'に変わります。 (0x20がASCIIの空白文字*であるという事実は手がかりかもしれません) –

+0

...私は解決策を見つけました。私はそれを許可されたらすぐに投稿します:) –

0

私は解決策を見つけました。そして、それ私が作った愚かな間違いだった...本当に愚か:FIELDMAXXは78とFIELDMAXYここでD

競技場は、int field[FIELDMAXX][FIELDMAXY];によって宣言された21.今create_obstacle()で見ているされていますの座標を新しく作成された障害物はFIELDMAXX + 1get_randypos()(1から21までの整数を返します)です。そして、ここでは、初心者の典型的な間違いです:move_obstacle()には、field[target_ob->x_pos][target_ob->y_pos] = OBSTACLE;(OBSTACLEは2と定義されています)という行があります。

すべての障害物は、2番目ごとに1つの「長さの単位」を左に移動します(target_ob->x_pos--;)。そしてy_pos = 21FIELDMAXX + 1ある)x_pos = 79と新しく作成された障害物がmove_obstacle()によって動かされるのであれば、その新しいx_posは(そのy_posがしている間)です。結果として、私が上で述べた行はfield[78][21]を​​に設定しようとしています - これは不可能です(範囲外です)。私は今、自分自身をちょっと恥じている気がします:)

関連する問題