out-of-process 예외 처리기를 만들고 싶었고 하위 프로세스가 예외를 발생시킬 때 전용 예외 처리를 수행하는 watch-dog 프로세스를 만들었습니다. 이벤트를 통해 워치 독 프로세스를 성공적으로 호출했습니다. 내가 직면하고있는 문제는 다른 프로세스에 예외 정보 포인터를 전달하려고하는 것입니다. 문제 해결 FileMapping을 사용하는 _EXCEPTION_POINTERS *
는 여기 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 @ 한자 Passant! 나는 한 가지 명확한 설명만을하고있다. MINIDUMP_EXCEPTION_INFORMATION.ExceptionPointers 필드를 전달하려고 시도 했습니까? 자식 프로세스에서 읽을 수 있습니까 ?? –
예, 필드가있는 이유입니다. 아니요, "클라이언트 프로세스"에서는 읽을 수 없습니다. 또는 내가 설명한 것처럼 감시 프로세스. MiniDumpWriteDump에서 사용되며 미니 덤프 파일에 기록됩니다. 따라서 디버거에서 미니 덤프를 열면 예외가 발생한 위치를 표시 할 수 있습니다. 디버거는 포인터를 소유하고있는 프로세스를 디버깅하기 때문에 포인터를 사용하는 데 문제가 없습니다. –
그러면 Watchdog에서 MiniDumpWriteDump를 호출하는 데 필요한 단계와 방법은 무엇입니까? –