2017-08-10 5 views
0

一部の組み込みデバイスのシミュレータとして機能する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、プロセスハンドル、ビジュアルスタジオデバッガへの接続を維持しながら、同じアドレス空間内のプロセスイメージ?

+2

いや、この場合においても窓 – RbMm

答えて

0

Windows上でこのような機能が存在しないという単純な答えが残念です。

0

Windowsは、あなたが求めているものをサポートしていません。あなたは、例えば、代わりに、ループ内で実行するようにmain()コードを再構築する必要があります:

//some global environment 
... 

int main(int argc, char* argv[]) 
{ 
    __debugbreak(); 

    do 
    { 
     //... (re)initialize simulated device 
     //... do some stuff 
    } 
    while (restart needed); 

    //... do some other testing stuff 
    return 0; 
} 
+0

には存在しないの近くには何も「(再)初期化シミュレーションデバイス」操作を手動で行う必要がありませんこれらの "オリジナルのファイルの何千もの"に広がった統計を(再)初期化することを含む@ –

+0

@ Chajnik-U:グローバルとスタティックを取り除き、それらをオブジェクトにラップし、再初期化するだけで古いオブジェクトを破壊し、 。 –

関連する問題