Может ли ptrace считывать / записывать данные из многопоточного процесса, учитывая, что один и только один поток остановлен?

документация на 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 пытается свободно читать / писать.

0

Решение

Да, вы можете прочитать глобальную память, но результат может быть противоречивым, если запущенные потоки изменяют память одновременно. Кроме того, поток контекст (регистры и флаги) можно получить только для отслеженных остановленных потоков.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]