2014-02-12 2 views
0

Я встретил проблему. Значение указателя было изменено, и указатель указал на адрес, к которому нельзя получить доступ. Кстати, адрес указателя находится на куче. Мне интересно, есть ли способ установить указатель только для чтения после его инициализации, а когда кто-то попытается изменить значение указателя, процесс завершится с ошибкой.как отлаживать перезапись памяти на linux

Спасибо. Jerry

ответ

0

Вы можете использовать mprotect, но я бы посоветовал не изменять страницы кучи, так как они управляются моим libc.

mprotect(page_aligned_address, len, PROT_READ); 

Если вы собираетесь использовать, что я рекомендую вам выделить память с помощью mmap, чтобы не испортить вашу кучу.

+0

Большое спасибо за ваш ответ. где память, выделенная mmap из, куча? – user3090584

+0

@ user3090584 'mmap' выделяет память непосредственно из системы где-то в вашей виртуальной памяти. Фактически 'malloc' называет' mmap' сам, чтобы получить память из системы, он просто управляет этими страницами по-разному. Часть вашей виртуальной машины, управляемая 'malloc' и семьей, называется кучей. –

2

Вы можете использовать valgrind для обнаружения недопустимого доступа указателя, а также многих других недопустимых применений памяти.

0

Используйте следующую команду для создания файла карты в окне терминала в Linux:

gcc -o demo -Wl,-Map,demo.map demo.c 

Вы можете легко узнать, где использование памяти идет не так или в месте которого overwritting происходит. Этот файл карты поможет вам подробно узнать о каждом разделе памяти.

+0

Зная, где находится память, не помогает отлаживать, почему переменная переписывается. – mah

Смежные вопросы