временно ли GDB устанавливает разрешения на запись
Нет.
В Linux / * 86, ptrace()
(это то, что GDB использует для чтения и записи подчиненного файла(будучи отлаженным) память процесса) позволяет выполнять чтение и запись на страницы, которые не могут быть прочитаны / записаны подчиненным, что в точности приводит к путанице, которую вы описали.
Это можно считать ошибкой в ядре.
Следует отметить, что ядро имеет , чтобы позволить ptrace записывать в нормально недоступный для записи раздел .text
, чтобы отладчик мог устанавливать точки останова (что выполняется путем перезаписи исходной инструкции).с инструкцией точки останова / прерывания - int3
через PTRACE_POKETEXT
запрос).
Ядро не должно делать то же самое для POKE_DATA
, но man ptrace
говорит:
PTRACE_POKETEXT, PTRACE_POKEDATA
Copies the word data to location addr in the child's memory.
As above, the two requests are currently equivalent.
Я полагаю, что именно эта эквивалентность вызывает текущее поведение.