我想做一個進程外的異常處理程序,我創建了一個看門狗進程,它在子進程引發異常時執行專門的異常處理。我通過事件成功地調用了看門狗進程。我面臨的問題是在嘗試將異常信息指針傳遞給其他進程時。麻煩通過_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