Могу ли я использовать GDB для отладки запущенного процесса?

В Linux, можно ли использовать GDB для отладки процесса, который в настоящее время работает?

Ответ 1

Да. Используйте команду attach. Для получения дополнительной информации просмотрите эту ссылку. Ввод help attach на консоли GDB дает следующее:

(gdb) help attach

Присоединить к процессу или файлу вне GDB. Эта команда прикрепляется к другой цели, того же типа, что и ваш последний Команда "target" ( "info files" покажет ваш целевой стек). Команда может принимать в качестве аргумента идентификатор процесса, имя процесса (с необязательным идентификатором процесса как суффикс) или файл устройства. Для идентификатора процесса у вас должно быть разрешение отправлять сигнал процесса, и он должен иметь тот же самый эффективный uid, что и отладчик. При использовании "attach" для существующего процесса отладчик находит программа, работающая в этом процессе, глядя сначала в текущую рабочую или (если их не найти), используя путь поиска исходного файла (см. команду "directory" ). Вы также можете использовать команду "file" для указания программы и для загрузки ее таблицы символов.


ПРИМЕЧАНИЕ. У вас может возникнуть трудность при подключении к процессу из-за улучшенной безопасности в ядре Linux - например, прикрепление к дочернему элементу одной оболочки из другого.

Вероятно, вам нужно установить /proc/sys/kernel/yama/ptrace_scope в зависимости от ваших требований. Во многих системах по умолчанию используется значение 1 или выше.

The sysctl settings (writable only with CAP_SYS_PTRACE) are:

0 - classic ptrace permissions: a process can PTRACE_ATTACH to any other
    process running under the same uid, as long as it is dumpable (i.e.
    did not transition uids, start privileged, or have called
    prctl(PR_SET_DUMPABLE...) already). Similarly, PTRACE_TRACEME is
    unchanged.

1 - restricted ptrace: a process must have a predefined relationship
    with the inferior it wants to call PTRACE_ATTACH on. By default,
    this relationship is that of only its descendants when the above
    classic criteria is also met. To change the relationship, an
    inferior can call prctl(PR_SET_PTRACER, debugger, ...) to declare
    an allowed debugger PID to call PTRACE_ATTACH on the inferior.
    Using PTRACE_TRACEME is unchanged.

2 - admin-only attach: only processes with CAP_SYS_PTRACE may use ptrace
    with PTRACE_ATTACH, or through children calling PTRACE_TRACEME.

3 - no attach: no processes may use ptrace with PTRACE_ATTACH nor via
    PTRACE_TRACEME. Once set, this sysctl value cannot be changed.

Ответ 2

Вы можете подключиться к текущему процессу с помощью gdb -p PID.

Ответ 3

Да. Вы можете сделать:

gdb program_name program_pid

Ярлык будет (при условии, что работает только один экземпляр):

gdb program_name `pidof program_name`

Ответ 4

Используемая команда gdb attach pid, где pid - это идентификатор процесса процесса, к которому вы хотите подключиться.

Ответ 5

Да, вы можете. Предположим, что выполняется процесс foo...

ps -elf | grep foo

look for the PID number

gdb -a {PID number}

Ответ 6

Если кто-то хочет присоединить процесс, этот процесс должен иметь того же владельца. Корень может подключаться к любому процессу.

Ответ 7

ps -elf не показывает PID. Вместо этого я рекомендую:

ps -ld | grep foo
gdb -p PID

Ответ 8

Самый простой способ - указать идентификатор процесса.

gdb -p 'pidof your_running_program_name'

Пожалуйста, получите полный список параметров в команде man gdb.

Если для одной и той же программы запущено несколько процессов, то следующая команда выведет список процессов.

ps -C program -o pid h
<number>

Затем идентификатор процесса вывода (число) можно использовать в качестве аргумента для GDB.

gdb -p <process id>