Как отладчик работает в Linux?

Я никогда не видел имени файла с новой строкой кроме, сознательно созданных к тестовым приложениям, которые управляют именами файлов. Имена файлов, содержащие новые строки, могут появиться потому что:

  • Некоторая ошибка или пользовательская ошибка (например, плохая вставка копии) привели к непреднамеренному имени файла.
  • Некоторое повреждение файловой системы влияло на имя файла.
  • Кто-то сознательно создал “странное” имя файла для использования дыры в системе безопасности, куда приложение поместило больше доверия именам файлов, это было передано, чем это должно иметь.

POSIX определяет имя файла как “имя, состоящее из 1 к байтам {NAME_MAX}, используемым для именования файла. Символы, составляющие имя, могут быть выбраны из набора всех символьных значений, исключая символ наклонной черты и пустой байт. Точка имен файлов и точечная точка имеют особое значение”. Нет никакой гарантии, что каждая файловая система примет “странные” имена файлов (единственные гарантируемые символы являются буквами ASCII, цифры, точка, дефис и подчеркивание, т.е. A-Z, a-z, 0-9 и ._-, с дефисом, запрещенным в первом положении), но самые собственные файловые системы на современных нельдах делают.

6
05.02.2011, 14:18
2 ответа

Существует системный вызов, названный ptrace. Требуется 4 параметра: операция, PID целевого процесса, адреса в целевой памяти процесса и указателя данных. Путем последние 2 параметра используются, зависит от операции.

Например, можно присоединить/отсоединить отладчик к процессу:

ptrace(PTRACE_ATTACH, pid, 0, 0);
...
ptrace(PTRACE_DETACH, pid, 0, 0);

Одноэтапное выполнение:

ptrace(PTRACE_ATTACH, pid, 0, 0);
int status;
waitpid(pid, &status, WSTOPPED);
while (...) {
    ptrace(PTRACE_SINGLESTEP, pid, 0, 0);
    // give the user a chance to do something
}
ptrace(PTRACE_DETACH, pid, 0, 0);

Вы можете также чтение-запись память целевого процесса с PTRACE_PEEKDATA и PTRACE_POKEDATA. Если Вы хотите видеть, что реальный пример проверяет gdb.

10
27.01.2020, 20:24

but then how does debugger 'know' what it is being attached to?

из man ptrace

The ptrace() system call provides a means by which one process (the "tracer") may observe and control the execution of another process (the "tracee"), and examine and change the tracee's memory and registers. It is primarily used to implement breakpoint debugging and system call tracing.

Как работают отладчики Часть 1 из 3 — хороший справочник по использованию ptrace , системного вызова отладки .

Очень кратко, потому что gdb — сложный зверь. В исходном коде gdb на сегодняшний день интересная информация об использовании gdb ptrace находится в target.h и inf -ptrace.c и может быть легко изгнан оттуда честолюбивым. Вы увидите, что gdb использует ptrace , обычно без особой двусмысленности. Обратитесь к компонентам целевой структуры _ops и найдите их в inf -ptrace.c .

От человека ptrace

>PTRACE_ATTACH
>       Attach to the process specified in pid, making it a tracee of the calling process.  The
>       tracee is sent a SIGSTOP, but will not necessarily have stopped by  the  completion  of
>       this  call;  use  waitpid(2)  to  wait  for the tracee to stop.  See the "Attaching and
>       detaching" subsection for additional information.  (addr and data are ignored.)

Итак, ptrace используется, но как он узнает, где что находится? Как GDB получает информацию, необходимую для установки точек останова и чтения данных? Без DWARF или другого меньшего формата отладки gdb на самом деле не имеет понятия, что он делает или где что-то найти. Вы все еще можете найти их с помощью gdb, выполнив поиск вручную, потому что информация все еще есть в образе программы, но gdb не имеет ни малейшего представления.

Ниже приведено из GDB User Manual -Stallman . GDB, как и, вероятно, все отладчики, использует формат отладки, обычно DWARF в разумной операционной системе, для символьной информации о функциях и переменных программы.

In order to debug a program effectively, you need to generate debugging information when you compile it. This debugging information is stored in the object file; it describes the data type of each variable or function and the correspondence between source line numbers and addresses in the executable code. .... You will have the best debugging experience if you use the latest version of the DWARF debugging format that your compiler supports.

Информацию о GDB, DWARF и PTRACE найти чрезвычайно легко. И если вам нравятся символы, информацию о файлах ELF тоже легко найти.

1
27.01.2020, 20:24

Теги

Похожие вопросы