2017-08-10 67 views
0

我创建了一个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调试器的连接?

+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:最好摆脱全局和静态,将它们包装在对象中,然后重新初始化可以简单地销毁旧对象并创建新对象。 –