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

110

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

Джастин Этье
источник

Ответы:

88

Да. Используйте 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.
Карл Норум
источник
8
Ссылка не работает :( С моей точки зрения, мне нравятся такие ответы, как этот от Дж. Польфера . Ура;)
olibre
Я исправил ссылку.
Атти,
это также работает для pid процесса на удаленной цели?
Bionix1441 08
Затем вам нужно запустить сервер отладки на удаленной цели; после этого должно быть так же.
Карл Норум
Флаг можно изменить с помощью echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope.
Дайсуке Арамаки
108

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

Николай Фетисов
источник
24

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

gdb program_name program_pid

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

gdb program_name `pidof program_name`
Дж. Польфер
источник
Я не знаю, что это делает, но это, черт возьми, не работает для меня. Он говорит, что <program_pid> не существует.
Owl
2
Я считаю, что это работает лучше всего, поскольку загружает таблицу символов в дополнение к присоединению к процессу. Следует отметить, что это program_nameработает, если вы находитесь в том же каталоге, что и двоичный файл. Я думаю, что путь к двоичному файлу будет работать, если вы находитесь в другом каталоге.
KarateSnowMachine
Разве вы не забыли -pперед program_id? Кроме того, может потребоваться запустить gdb с sudo для подключения к запущенному процессу.
mxmlnkn 05
15

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

Дэвид Канарек
источник
3

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

ps -elf | grep foo

ищите номер PID

gdb -a {номер PID}
t0mm13b
источник
5
На каком дистрибутиве вы работаете? Используя последнюю версию Fedora, 'gdb -a' выводит ошибку «option -a is ambiguous».
Джастин Этье,
1
официальный аргумент -p / - pid
Махмуд Аль-Кудси
3

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

Милан Керслагер
источник
2

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

ps -ld | grep foo
gdb -p PID
Нино Перейра
источник
2

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

gdb -p `pidof your_running_program_name`

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

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

ps -C program -o pid h
<number>

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

gdb -p <process id>
Шува
источник