Документация по ptrace немного нечеткая для меня. В нем говорится:
Сначала трассировка должна быть привязана к трассеру. Вложения и последующие команды относятся к потоку: в многопоточном процессе каждый поток может быть индивидуально подключен к (потенциально другому) трассеру или оставлен без привязки и, следовательно, не отлажен. Поэтому "tracee" всегда означает "(один) поток" никогда "(возможно, многопоточный) процесс".
Также:
В следующих запросах pid указывает идентификатор потока отслеживаемого объекта. Для запросов, отличных от PTRACE_ATTACH, PTRACE_SEIZE, PTRACE_INTERRUPT и PTRACE_KILL, трассировка должна быть остановлена.
Итак, если у нас многопоточный процесс и мы присоединяемся к одному потоку с PTRACE_SEIZE и останавливаем его с помощью PTRACE_INTERRUPT, можем ли мы читать/записывать все глобальные данные процесса с помощью PTRACE_PEEKTEXT, PTRACE_PEEKDATA, PTRACE_POKETEXT или PTRACE_POKEDATA?
Вторичный вопрос: если ответ на главный вопрос - да, зачем нужен поток для остановки? Я думал, что остановка необходима для достижения какого-то механизма блокировки, но если один поток остановлен, другие могут записывать в память, которую ptrace пытается читать/писать свободно.
Да, вы можете прочитать глобальную память, но результат может быть непоследовательным, если есть текущие потоки, изменяющие память одновременно. Более того, контекст потока (регистры и флаги) может быть получен только для отслеживаемых, остановленных потоков.