一个进程可以覆盖另一个进程的内存吗?

时间:2011-02-04 00:57:50

标签: c++ windows memory process

我的项目由3个流程组成。进程1是进程2和3的“服务器”,并实现共享内存。进程2随应用程序错误随机崩溃,试图访问它自己的内存,已经以某种方式损坏。

错误是: 在内存位置的某个地址无效的指令有些不好的地址。

我会在哪里开始查看,在流程1中我会查找哪些类型的内容,以查看它是否覆盖了进程2的内存?

谢谢。

4 个答案:

答案 0 :(得分:6)

意外覆盖另一个进程的内存(没有它的合作)?不*,因为你必须“意外”正确地做很多事情。 (您必须“意外”打开流程的句柄,并“不小心”拨打WriteProcessMemory。)

故意?是的,使用WriteProcessMemory功能。

*如果您正在共享内存,则出现错误的可能性会突然增加。

答案 1 :(得分:3)

如果进程主动尝试,则进程只能覆盖另一个进程的内存。调试就是一个例子,共享内存是另一个例子。意外写入另一个进程的代码或数据区是不太可能的。

所以问题是,很可能是一个关于进程2的错误。我的意思是,进程2甚至不共享其内存,对吧?因此,进程1不可能覆盖它。

答案 2 :(得分:3)

操作系统将阻止进程覆盖其他进程的内存,除非您作为内核的一部分运行。使用像valgrind这样的内存调试器来跟踪任何内存访问错误的原因。

编辑:你还可以包括使用操作系统调用访问另一个进程内存的可能性,但正如大家所说,你很可能没有这样做。在共享内存中传递指针是最可能的错误,但我仍然建议使用像valgrind这样的工具。

答案 3 :(得分:2)

共享内存中的数据结构是否包含任何绝对指针?这不仅是一个坏主意,因为绝对指针在其他进程中没有意义,但是一个进程可以说服其他进程疯狂地写入其内存。

通常,内存管理单元会阻止任何进程直接覆盖/损坏其他进程的内存。共享内存(包括文件映射)和WriteProcessMemory函数是一般规则的例外。