Может ли один процесс перезаписать память другого процесса? - PullRequest
3 голосов
/ 04 февраля 2011

Мой проект состоит из 3 процессов. Процесс 1 является «сервером» процессов 2 и 3 и реализует разделяемую память. Процесс 2 случайным образом завершается с ошибками приложения, пытаясь получить доступ к собственной памяти, которая была каким-либо образом повреждена.

Ошибка: Неверная инструкция по какому-то адресу в памяти, по другому не очень хороший адрес.

Где бы я начал искать и какие вещи я бы искал в процессе 1, чтобы посмотреть, не перезаписывает ли он память процесса 2?

Спасибо.

Ответы [ 4 ]

6 голосов
/ 04 февраля 2011

Случайно перезаписать память другого процесса (без его взаимодействия)?Нет *, потому что вы должны «случайно» сделать много вещей правильно.(Вы должны «случайно» открыть дескриптор процесса, а также «случайно» вызвать WriteProcessMemory.)

Намеренно?Да, с использованием функции WriteProcessMemory.

* Если вы разделяете память, вероятность возникновения ошибки возрастает.

3 голосов
/ 04 февраля 2011

ОС не позволит процессу перезаписать память другого процесса, если вы не работаете как часть ядра. Используйте отладчик памяти, такой как valgrind, чтобы отследить причину ошибок доступа к памяти.

Изменить: вы также можете включить возможность использования вызовов ОС для доступа к памяти другого процесса, но, как все говорили, вы, скорее всего, этого не делаете. Передача указателей в разделяемой памяти является наиболее вероятной ошибкой, но я все же предлагаю использовать такой инструмент, как valgrind.

3 голосов
/ 04 февраля 2011

Процесс может перезаписать память другого процесса только в том случае, если он активно пытается это сделать.Отладка - один пример, общая память - другой.Случайная запись в код или область данных другого процесса очень маловероятна.

Таким образом, проблема, скорее всего, связана с ошибкой процесса 2. Я имею в виду, что процесс 2 даже не разделяет свою память, верно?Поэтому процесс 1 не может его перезаписать.

2 голосов
/ 04 февраля 2011

Содержат ли структуры данных в разделяемой памяти абсолютные указатели? Мало того, что это плохая идея, потому что абсолютные указатели не имеют смысла в других процессах, но один процесс может убедить другой процесс писать дико через свою память.

Как правило, блок управления памятью не позволяет любому процессу напрямую перезаписать / повредить память другого процесса. Общая память (включая сопоставления файлов) и функция WriteProcessMemory являются исключениями из общего правила.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...