2016-11-30 10 views
1

私はSDLを使用してCでアーケードゲームエミュレータを作成していましたが、複数のCPUを搭載したシステムをエミュレートすると奇妙な問題に遭遇しました。私はこのような何かを持っている:私はエミュレート機能には全く関係がありません必要があるif文をコメントアウトする場合 私のCPUエミュレータの機能が並行して動作していないことを確認するにはどうすればよいですか?

int done = 0; 
int outputDebug = 0; 
FILE *fp = fopen("debug_output.txt", "w"); 

while (!done) 
{ 

    // Run one instruction on cpu #1 
    emulate(cpu1); 

    if (outputDebug) 
    fprintf(fp, "%d %d \n", cpu1->variable1, cpu1->variable2); 

    // Run one instruction on cpu #2 
    emulate(cpu2); 

    // pressing a key in here toggles outputDebug 
    checkInput(); 
} 

は今ここに...奇妙なものだ、いくつかのバグが離れて行く、と他のバグ表面。たとえば、SDL_GetTicks()のような他の重要でないコードを追加すると、別のバグが発生します。私はこれを数回再現しました。それぞれのバリエーションには常に同じバグがあります。

私は、エミュレート関数への2つの呼び出しが並列で実行されていなければならず、そこに他のコードを持たなければならないということです。違う方法。私はGNU Cコンパイラを使用していますが、最適化の引数を渡していません...デフォルトでも、-O0を渡してみましたが、すべて同じように動作します。

私は前述のようにGNUコンパイラを使用してWindows 7を使用していますが、SDLは私が使用している唯一の外部ライブラリです。

ここでは何が起こっていて、どうすれば修正できますか?

+0

基本的に、* emulate(x)*がスレッディングやフォークをしない場合、おそらくどこかUB(スタック/メモリ/ポインタ/配列のオーバーフロー...問題)があります。たぶん1つのCPUでのみエミュレートしようとしますか? –

+0

@racramanはまさに正しいです。関数呼び出しを追加したり削除したりすることによって動作が変わると、ほとんどの場合、初期化されていないスタック位置を読み込んでいるコードがあることを意味します。追加したり削除したりするコードによって、そのメモリは異なる値のままになります。もう1つの可能性は、スタック上の配列の外側に書いていることです。ゴミ箱の領域が動き回っているため、他のコードがバグの違う振る舞いを表示する原因になります。 'valgrind'や他のメモリ使用状況のデバッグフレームワークを使って、あなたの欠陥のあるコードを見つけることを検討してください。 – Gene

答えて

2

私はどこかにあなたのエミュレート機能では、あなたが初期化されていないメモリを参照していることを推測している - 例えば:

void somefunction(char *somearg) 
{ 
    static char *myvar; 

    if (somecondition) { 
     myvar = somearg; 
    } 

    // Now do something with myvar 

をsomeconditionを通じ、真の最初の時間であれば、MYVARは、プロセス内のアドレスに設定されます'メモリ空間。

someconditionがその後falseの場合、myvarはまだ同じアドレスを指しています。これはプロセスのメモリ空間に残っています(したがって、必ずしも障害が発生するとは限りません)。 'バグ')。

メモリ内のその特定のアドレスの左端の内容は、呼び出しスタックによって変更される可能性があります。その "fprintf"(それゆえ1つの "バグのセット")によって使用されたアドレスを指している可能性があります。 outputDebugがfalseの場合、そのメモリアドレスは他の関数で使用されている可能性があります(したがって、別の "バグのセット")。

もちろん、これはすべてのスペキュレーションです(あなたが提示したコードは上手く見えるので)。しかし、あなたが記述した症状を引き起こす可能性のある種類のものと、おそらく何を探すかの例です。

+0

ありがとうracraman!これはかなり正確に私の問題だった。 Dr. Memoryをダウンロードしてインストールしました。すぐにこれを選択しました。 – pops

関連する問題