Могу ли я использовать GDB для отладки запущенного процесса? - PullRequest
102 голосов
/ 22 февраля 2010

Могу ли я использовать GDB для отладки процесса, который в данный момент выполняется в Linux?

Ответы [ 7 ]

101 голосов
/ 22 февраля 2010

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

80 голосов
/ 22 февраля 2010

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

(gdb) help attach

Присоединить к процессу или файлу за пределами GDB. Эта команда присоединяется к другой цели того же типа, что и ваша последняя Команда "target" ("info files" покажет ваш целевой стек). Команда может принимать в качестве аргумента идентификатор процесса, имя процесса (с необязательным идентификатором процесса в качестве суффикса) или файл устройства. Для идентификатора процесса у вас должно быть разрешение отправить процессу сигнал, и он должен иметь тот же эффективный идентификатор пользователя, что и отладчик. При использовании «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.
22 голосов
/ 24 апреля 2010

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

gdb program_name program_pid

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

gdb program_name `pidof program_name`
14 голосов
/ 22 февраля 2010

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

3 голосов
/ 22 февраля 2010

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

ps -elf | grep foo

look for the PID number

gdb -a {PID number}
2 голосов
/ 13 октября 2016

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

2 голосов
/ 21 января 2016

ps -elf не показывает PID. Я рекомендую использовать вместо:

ps -ld | grep foo
gdb -p PID
...