我想做一个进程外的异常处理程序,我创建了一个看门狗进程,它在子进程引发异常时执行专门的异常处理。我通过事件成功地调用了看门狗进程。我面临的问题是在尝试将异常信息指针传递给其他进程时。麻烦通过_EXCEPTION_POINTERS *使用FileMapping
我在这里登陆Passing a pointer to process spawned with 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:我甚至尝试过单独传递PEXCEPTION_RECORD结构,但不起作用。
Thans @Hans Passant!我只有一个澄清。你有没有尝试传递MINIDUMP_EXCEPTION_INFORMATION.ExceptionPointers字段。它会在子进程中可读吗? – 2013-04-22 14:45:32
是的,这就是为什么该领域在那里。不,它在“客户端进程”中不可读。或者我解释过的监督程序。它由MiniDumpWriteDump使用并记录在小型转储文件中。因此,当您在调试器中打开小型转储程序时,它可以向您显示发生异常的位置。调试器在使用指针时没有问题,因为它正在调试拥有指针的进程。 – 2013-04-22 14:50:33
然后,如何以及如何在看门狗中调用MiniDumpWriteDump所需的步骤? – 2013-04-22 14:56:48