我创建了一个Windows可执行文件,用作某些嵌入式设备的模拟器(所有业务逻辑与原始设备完全相同,只有硬件相关的东西被删除)。重新启动Windows进程inplace保存进程ID和句柄
这种模拟需要不时地,并在“正常”使用情况下,它类似的东西复位:
//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()
存根,这是从原始代码中的多个地方调用。
问题是_execv
在Windows上并不完全表现为execv
在Linux上: 当我调试在Visual Studio此应用程序的_execv
不更换“重新启动”图像当前的进程映像。相反,它只是创建一个具有新ID的新进程,并终止当前进程,从而将其从Visual Studio中分离出来,以便保留所有需要重新附加到新进程的断点(在单个调试会话中有几十次重新启动)。
目前我使用__debugbreak()作为解决方法。 其他选项是通过重新初始化全局环境并使用setjmp/longjmp的某种组合来重置模拟 - 但是全局环境和相应的初始值设定项通过原始文件的临时数据传播,并且它们大多数是静态的,因此无法处理这种重置手动(我也不允许编辑原始文件)。
所以,问题是:在那里,导致当前进程通过在重置所有的全局(静态)变量,如是否有可能重新加载相同的重新启动“就地”某些Windows API /通用的解决方法在同一地址空间内处理图像,保留外部可观察的进程ID,进程句柄以及与Visual Studio调试器的连接?
没有,什么都没有,甚至靠近窗户在这种情况下 – RbMm