我想做一个进程外异常处理程序,并且创建了一个看门狗进程,当子进程引发异常时,它会进行专门的异常处理。我已经通过事件成功调用了看门狗进程。我面临的问题是在尝试将异常信息指针传递给其他进程时。
我降落在这里将指针传递给由 exec() 生成的进程并了解到在共享内存中传递指针存在以下问题:
“如果您使用共享内存,则无法传递指针。指针将包含虚拟地址,该虚拟地址因进程而异。您必须根据共享内存区域的起始位置交换偏移值。
如果不使用共享内存,则无法交换任何类型的指针:其他进程将无法访问您进程的内存。”
现在我该如何克服这个问题?
流程1:
struct mytest
{
_EXCEPTION_POINTERS * except ;
DWORD ThreadId ;
DWORD ProcessId ;
}
OpenFileMapping ( ) ;
void * pBuf = MapViewOfFile ( ) ;
mytest passdata ;
CopyMemory ( pBuf , &passdata , sizeof ( passdata ) ) ;
UnMapView ( ) ;
CloseHandle ( ) ;
(例如)流程2:
cout << passdata->except->ExceptionRecord->ExceptionCode << endl ;
会崩溃的。我理解这是因为虚拟地址是特定于进程的。但在这种情况下如何将异常信息传递到不同的进程并编写小型转储?
P.S:我什至尝试单独传递 EXCEPTION_RECORD 结构,但不起作用。
我会将其放在一起作为答案,尽管它确实应该是对汉斯的回答(以及那里的评论)但似乎有必要进行一些解释:
问题中发布的代码正确传递了struct mytest
结构到共享内存中。
第二个代码片段:
(例如)流程2:
cout << passdata->except->ExceptionRecord->ExceptionCode << endl ;
但显示了一个误解:虽然您可以读取指针的值passdata.except
,在进程 2 中这只是一个任意的 32/64 位值,它不是一个有效的指针。
You can将此传递给MiniDumpWriteDump
,该函数将在目标进程(proc 1)的上下文中评估该指针值。但是你cannot在过程 #2 中取消引用它。
汉斯的例子给出了解决方案,如果你需要的值ExeptionCode
在进程 #2 中,那么您需要取消引用 proc#1 中的指针并将值放入写入共享内存的数据中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)