私は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は私が使用している唯一の外部ライブラリです。
ここでは何が起こっていて、どうすれば修正できますか?
基本的に、* emulate(x)*がスレッディングやフォークをしない場合、おそらくどこかUB(スタック/メモリ/ポインタ/配列のオーバーフロー...問題)があります。たぶん1つのCPUでのみエミュレートしようとしますか? –
@racramanはまさに正しいです。関数呼び出しを追加したり削除したりすることによって動作が変わると、ほとんどの場合、初期化されていないスタック位置を読み込んでいるコードがあることを意味します。追加したり削除したりするコードによって、そのメモリは異なる値のままになります。もう1つの可能性は、スタック上の配列の外側に書いていることです。ゴミ箱の領域が動き回っているため、他のコードがバグの違う振る舞いを表示する原因になります。 'valgrind'や他のメモリ使用状況のデバッグフレームワークを使って、あなたの欠陥のあるコードを見つけることを検討してください。 – Gene