gpt4 book ai didi

c++ - 无法使用 FileMapping 传递 _EXCEPTION_POINTERS *

转载 作者:搜寻专家 更新时间:2023-10-31 01:10:13 24 4
gpt4 key购买 nike

我想做一个进程外异常处理程序,我已经创建了一个看门狗进程,它在子进程引发异常时进行专门的异常处理。我已经通过事件成功调用了看门狗进程。我面临的问题是在尝试将异常信息指针传递给其他进程时。

我降落在这里 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 结构,但不起作用。

最佳答案

我会把它放在一起作为答案,尽管它确实应该是对 Hans's answer 的评论(以及那里的评论)但似乎有必要进行一些解释:

问题中发布的代码正确地将 struct mytest 结构的值传递到共享内存中。

第二个代码片段:

(For ex)Process 2 :

cout << passdata->except->ExceptionRecord->ExceptionCode << endl ;

虽然显示了一个误解:虽然您可以读取指针 passdata.except 的值,但在进程 2 中这只是一个任意的 32/64 位值,它不是一个有效的指针。

可以将其传递给MiniDumpWriteDump,该函数将在目标进程(proc 1)的上下文中评估此指针值。但是您不能在进程 #2 中取消引用它。

Hans 的例子给出了解决方案,如果你需要进程#2 中的 ExeptionCode 的值,那么你需要取消引用 proc#1 中的指针并将该值放入你写入共享的数据中内存。

关于c++ - 无法使用 FileMapping 传递 _EXCEPTION_POINTERS *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16147753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com