我的项目由3个进程组成。进程1是进程2和3的“服务器”,并实现了共享内存。进程2会随机崩溃,出现应用程序错误,试图访问自己的内存,但该内存已被某种方式破坏。
错误信息为:某个地址处的无效指令位于某个不好的地址的内存位置。
我应该从哪里开始查找,并在进程1中寻找哪些类型的问题,以确定它是否正在覆盖进程2的内存?
谢谢。
错误信息为:某个地址处的无效指令位于某个不好的地址的内存位置。
我应该从哪里开始查找,并在进程1中寻找哪些类型的问题,以确定它是否正在覆盖进程2的内存?
谢谢。
意外地覆盖另一个进程的内存(没有它的合作)?不行,因为你必须“意外地”做很多正确的事情。(你必须“意外地”打开进程的句柄,并且还要“意外地”调用WriteProcessMemory
。)
有意地?是的,使用WriteProcessMemory
函数。
* 如果你正在共享内存,则出错的可能性会激增。
在共享内存中的数据结构中是否包含任何绝对指针?这不仅是一个坏主意,因为绝对指针在其他进程中没有意义,而且一个进程可以说服另一个进程通过它的内存进行疯狂的写入。
一般来说,内存管理单元防止任何进程直接覆盖/破坏另一个进程的内存。共享内存(包括文件映射)和WriteProcessMemory
函数是一般规则的例外。
只有主动尝试才能覆盖另一个进程的内存,例如调试和共享内存。意外写入另一个进程的代码或数据区域的可能性非常小。
因此,问题很可能是进程2内部的错误。我的意思是,进程2甚至没有共享它的内存,对吧?所以进程1不可能覆盖它。
除非您正在作为内核的一部分运行,否则操作系统将防止进程覆盖另一个进程的内存。使用像valgrind这样的内存调试器来跟踪任何内存访问错误的原因。
编辑:您也可以包括使用操作系统调用来访问另一个进程的内存的可能性,但正如每个人所说,您很可能不会这样做。 在共享内存中传递指针是最有可能出错的地方,但我仍建议使用像valgrind这样的工具。