一个进程能否覆盖另一个进程的内存?

3
我的项目由3个进程组成。进程1是进程2和3的“服务器”,并实现了共享内存。进程2会随机崩溃,出现应用程序错误,试图访问自己的内存,但该内存已被某种方式破坏。
错误信息为:某个地址处的无效指令位于某个不好的地址的内存位置。
我应该从哪里开始查找,并在进程1中寻找哪些类型的问题,以确定它是否正在覆盖进程2的内存?
谢谢。

1
甚至不需要其他进程。如果在“进程2”中存在错误,它完全有能力破坏自己的内存占用。 - Marc B
4个回答

6

意外地覆盖另一个进程的内存(没有它的合作)?不行,因为你必须“意外地”做很多正确的事情。(你必须“意外地”打开进程的句柄,并且还要“意外地”调用WriteProcessMemory。)

有意地?是的,使用WriteProcessMemory函数。

* 如果你正在共享内存,则出错的可能性会激增。


1
他说有共享内存。如果一个人不理解共享内存的限制,很多事情都可能出错。 - Ben Voigt
1
@Ben:你说得完全正确,我漏掉了那部分。回想起来,我的答案应该被投票否决。:\ - user541686
我认为这是完全可以修复的。我建议将第一句话(实际上是一个单词)改为“意外地覆盖了另一个进程的内存而没有得到它的合作?”然后添加“如果另一个进程同意共享内存,那么一切都无法预测”。 - Ben Voigt
1
即使您有意共享内存,您也只会共享一个小窗口。窗口之外的所有内容仍然是禁止访问的,例如两侧的堆栈和堆。 - MSalters

3

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

一般来说,内存管理单元防止任何进程直接覆盖/破坏另一个进程的内存。共享内存(包括文件映射)和WriteProcessMemory函数是一般规则的例外。


3

只有主动尝试才能覆盖另一个进程的内存,例如调试和共享内存。意外写入另一个进程的代码或数据区域的可能性非常小。

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


我在问题中没有看到任何暗示代码被覆盖。 - Ben Voigt

3

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

编辑:您也可以包括使用操作系统调用来访问另一个进程的内存的可能性,但正如每个人所说,您很可能不会这样做。 在共享内存中传递指针是最有可能出错的地方,但我仍建议使用像valgrind这样的工具。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接