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