Redémarrez le processus Windows in-situ en conservant l’ID de processus et les descripteurs

J’ai créé un exécutable Windows qui sert de simulateur pour un périphérique intégré (toute la logique métier est identique à celle du périphérique d’origine et seuls les éléments liés au matériel sont masqués).

Cette simulation doit être réinitialisée de temps en temps, et dans des cas d’utilisation “normaux”, elle fait quelque chose comme ça:

//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; } 

Remarque: le code ci-dessus est juste pour illustrer l’idée principale, dans une application réelle, que l’appel execv se trouve réellement dans le HW_Reset() , appelé à partir de plusieurs emplacements dans le code d’origine.

Le problème est que _execv sous Windows ne se comporte pas exactement comme execv sous Linux: lorsque je débogue cette application dans Visual Studio, _execv ne remplace pas l’image de processus actuelle par une image “redémarrée”. Au lieu de cela, il crée simplement un nouveau processus avec un nouvel ID et met fin au processus en cours, ce qui le dissocie de Visual Studio. Par conséquent, afin de conserver tous les points d’arrêt dont j’ai besoin pour me reconnecter à ce nouveau processus (il existe des dizaines de redémarrages dans une seule session de débogage). ).

Actuellement, j’utilise __debugbreak () comme solution de contournement. Une autre option consiste à réinitialiser la simulation en réinitialisant l’environnement global et en utilisant une combinaison de setjmp / longjmp – mais l’environnement global et les initialiseurs correspondants sont répartis sur des milliers de fichiers d’origine. La plupart d’entre eux sont statiques. Il est donc impossible de gérer manuellement cette réinitialisation. (De plus, je ne suis pas autorisé à éditer les fichiers originaux).

La question est donc la suivante: existe-t-il une solution de contournement générique pour les API / Windows de Windows qui provoque le redémarrage du processus actuel “en place” en réinitialisant toutes les variables globales (et statiques), comme dans le cas où il serait possible de recharger la même image de processus à la même adresse espace, en préservant l’identifiant de processus observable, le descripteur de processus et la connexion au débogueur Visual Studio?

Je crains que la réponse simple soit qu’aucune fonctionnalité de ce type n’existe sous Windows.

Windows ne prend pas en charge ce que vous demandez. Vous devrez restructurer votre code main() pour qu’il s’exécute en boucle, par exemple:

 //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; }