Разница между ptrace (PTRACE_PEEKUSER) и ptrace (PTRACE_PEEKDATA)? - PullRequest
12 голосов
/ 21 марта 2012

После публикации большого количества вопросов на ptrace (самые последние 5 вопросов - мои :() Я, наконец, получил желаемый результат при замене

reg_val[1] = ptrace(PTRACE_PEEKDATA, child, 4 * EBX, NULL);

на

reg_val[1] = ptrace(PTRACE_PEEKUSER, child, 4 * EBX, NULL);

Разница, упомянутая в справочной странице, выглядит следующим образом

  • PTRACE_PEEKTEXT читает слово по адресу addr в памяти ребенка
  • PTRACE_PEEKUSER читает слово по адресу addr в смещенииобласть ПОЛЬЗОВАТЕЛЯ ребенка

Я не могу понять эту разницу в одиночку из справочной страницы. Может ли кто-нибудь рассказать мне больше об этом ??

1 Ответ

21 голосов
/ 21 марта 2012

PTRACE_PEEKDATA - для чтения раздела данных / кода ребенка (процесс в целом - так называемая трассировка). Как вы знаете, отладчики часто используют ptrace. Они могут использовать этот вызов для проверки значений переменных. Например, в GDB/DBX, если вы говорите

print count

отладчики внутренне вызовут ptrace с PTRACE_PEEKDATA и найдут его значение.

PTRACE_PEEKUSER используется для чтения содержимого области USER ребенка, которая содержит содержимое регистров и другую информацию. sys / user.h перечисляет, что это за другая информация.

Например, область USER содержит,

struct user_regs_struct
{
  long int ebx;
  long int ecx;
  long int edx;
  long int esi;
  long int edi;
  long int ebp;
  long int eax;
  long int xds;
  long int xes;
  long int xfs;
  long int xgs;
  long int orig_eax;
  long int eip;
  long int xcs;
  long int eflags;
  long int esp;
  long int xss;
};

Короче :

  • PTRACE_PEEKDATA - для данных программы (например, переменных) и кода;
  • PTRACE_PEEKUSER для таких вещей, как значения регистров и другая отладочная информация;

Обратите внимание на эквивалентность между PTRACE_PEEKDATA и PTRACE_PEEKTEXT. С man ptrace:

В Linux нет отдельных адресных пространств для текста и данных, поэтому в настоящее время эти два запроса эквивалентны.

...