2011-02-04 6 views
2

내 프로젝트는 3 개의 프로세스로 구성됩니다. 프로세스 1은 프로세스 2와 프로세스 3의 "서버"이며 공유 메모리를 구현합니다. 프로세스 2는 응용 프로그램 오류로 무작위로 충돌하고, 자체 메모리에 액세스하려고 시도하며, 그 오류는 어떻게 든 손상되었습니다.한 프로세스가 다른 프로세스의 메모리를 덮어 쓸 수 있습니까?

오류 : 메모리 위치의 일부 주소가 올바르지 않습니다. 일부 주소가 잘못되었습니다.

프로세스 1에서 프로세스 2의 메모리를 덮어 쓰는지 확인하기 위해 어떤 유형의 데이터를 찾고 싶습니까?

감사합니다.

+1

"기타"프로세스가 필요하지 않습니다. 프로세스 2에 버그가있는 경우 자체 메모리 풋 프린트를 완벽하게 스톰핑 할 수 있습니다. –

답변

6

실수로 다른 프로세스의 메모리를 덮어 씁니다 (협력하지 않고)? 당신이 "실수로"많은 일을 정확하게해야하기 때문에 * 아닙니다. (실수로 프로세스에 대한 핸들을 열어야하고, 실수로 WriteProcessMemory이라고 부르십시오.)

의도적으로? 예, WriteProcessMemory 기능을 사용합니다.

* 메모리를 공유하는 경우 오류가 발생할 가능성이 큽니다.

+1

그는 공유 메모리가 있다고했습니다. 공유 메모리의 한계를 이해하지 못한다면 잘못 될 수있는 많은 것들이 있습니다. –

+1

@ 벤 : 당신은 완전히 정확합니다. 나는 그 부분을 놓쳤습니다. 되돌아 보면, 내 대답은 반드시 투표해야합니다. : \ – Mehrdad

+0

나는 그것이 완벽하게 고칠 수 있다고 생각한다. 첫 번째 문장 (실제로는 단어)을 "우연히 다른 프로세스의 메모리를 덮어 쓰지 않고 덮어 쓰는 것"으로 바꾸는 것이 좋습니다. "다른 프로세스가 메모리 공유에 동의하면 모든 베팅이 해제됩니다"라고 덧붙입니다. –

2

공유 메모리의 데이터 구조에는 절대 포인터가 포함되어 있습니까? 절대 포인터는 다른 프로세스에서는 의미가 없으므로 나쁜 생각 일뿐만 아니라 한 프로세스는 다른 프로세스가 메모리를 통해 거칠게 쓰도록 설득 할 수 있습니다.

일반적으로 메모리 관리 장치는 모든 프로세스가 다른 프로세스의 메모리를 직접 덮어 쓰거나 손상시키는 것을 방지합니다. 공유 메모리 (파일 매핑 포함) 및 WriteProcessMemory 기능은 일반적인 규칙의 예외입니다.

3

프로세스가 적극적으로 시도하는 경우 다른 프로세스의 메모리 만 덮어 쓸 수 있습니다. 디버깅은 하나의 예이며 공유 메모리는 다른 것입니다. 다른 프로세스의 코드 또는 데이터 영역에 실수로 쓰는 것은 거의 없습니다.

문제는 대부분 프로세스 2가 발생하는 버그입니다. 프로세스 2는 메모리를 공유하지 않는 것입니까? 그렇습니다. 그래서 프로세스 1은 아마도 그것을 덮어 쓸 수 없습니다.

+0

코드에 덮어 쓰기를 제안하는 질문에는 아무것도 표시되지 않습니다. –

3

OS는 커널의 일부로 실행하지 않는 한 프로세스가 다른 프로세스의 메모리를 덮어 쓰지 못하게합니다. valgrind와 같은 메모리 디버거를 사용하여 메모리 액세스 오류의 원인을 추적하십시오.

편집 : OS 호출을 사용하여 다른 프로세스의 메모리에 액세스 할 수있는 가능성을 포함시킬 수도 있지만 모든 사람들이 말했듯이, 당신은 그렇게하지 않을 가능성이 큽니다. 공유 메모리에서 포인터를 전달하는 것이 가장 가능성있는 오류이지만 valgrind와 같은 도구를 사용하는 것이 좋습니다.

관련 문제