一部の組み込みデバイスのシミュレータとして機能するWindows実行可能ファイルを作成しました(すべてのビジネスロジックは元のデバイスとまったく同じで、HW関連のものだけがスタブされます)。プロセスIDとハンドルを保存してWindowsプロセスを再開
このシミュレーションは、随時リセットする必要があり、「正常な」ユースケースには、それはそのようなことを行います。
//some global environment
...
int main(int argc, char* argv[])
{
__debugbreak();
//... do some stuff
//if(restart needed){
printf("before _execv");
_execv(argv[0], argv); //"reset" simulated device
//}
//... do some other testing stuff
return 0;
}
注:上記のコードは、単にexecv
実際のアプリケーションでは、主要なアイデアを説明するためにあります呼び出しは実際にHW_Reset()
スタブにあり、元のコードの複数の場所から呼び出されます。私は、Visual Studioでこのアプリケーションをデバッグするとき _execv
は「再起動」の画像と現在のプロセスイメージを置き換えるものではありません:
問題は、Windows上の_execv
は、Linux上でexecv
として正確に動作しないということです。代わりに、新しいIDで新しいプロセスを作成し、現在のプロセスを終了させ、Visual Studioから切り離すので、新しいプロセスに何度も再接続する必要があるすべてのブレークポイントを保持します(1回のデバッグセッションで数十回の再起動があります)。
現在、私は回避策として__debugbreak()を使用しています。 その他のオプションは、グローバル環境を再初期化し、setjmp/longjmpの組み合わせを使用してシミュレーションをリセットすることですが、グローバル環境とそれに対応するイニシャライザは元のファイルの何千ものファイルに分散されています。手動で(元のファイルを編集することもできません)。
質問: Windows API /一般的な回避策があります。現在のプロセスは、グローバル変数(および静的変数)をすべて再設定することによって "インプレース"を再起動します外見的に観測可能なプロセスID、プロセスハンドル、ビジュアルスタジオデバッガへの接続を維持しながら、同じアドレス空間内のプロセスイメージ?
いや、この場合においても窓 – RbMm