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

0

Документация по ptrace немного нечеткая для меня. В нем говорится:

Сначала трассировка должна быть привязана к трассеру. Вложения и последующие команды относятся к потоку: в многопоточном процессе каждый поток может быть индивидуально подключен к (потенциально другому) трассеру или оставлен без привязки и, следовательно, не отлажен. Поэтому "tracee" всегда означает "(один) поток" никогда "(возможно, многопоточный) процесс".

Также:

В следующих запросах pid указывает идентификатор потока отслеживаемого объекта. Для запросов, отличных от PTRACE_ATTACH, PTRACE_SEIZE, PTRACE_INTERRUPT и PTRACE_KILL, трассировка должна быть остановлена.

Итак, если у нас многопоточный процесс и мы присоединяемся к одному потоку с PTRACE_SEIZE и останавливаем его с помощью PTRACE_INTERRUPT, можем ли мы читать/записывать все глобальные данные процесса с помощью PTRACE_PEEKTEXT, PTRACE_PEEKDATA, PTRACE_POKETEXT или PTRACE_POKEDATA?

Вторичный вопрос: если ответ на главный вопрос - да, зачем нужен поток для остановки? Я думал, что остановка необходима для достижения какого-то механизма блокировки, но если один поток остановлен, другие могут записывать в память, которую ptrace пытается читать/писать свободно.

Теги:
multithreading
ptrace

1 ответ

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню