Могу ли я использовать GDB для отладки запущенного в данный момент процесса под Linux?
Могу ли я использовать GDB для отладки запущенного в данный момент процесса под Linux?
Ответы:
Да. Используйте 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.
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
.
Вы можете присоединиться к запущенному процессу с помощью gdb -p PID
.
Да. Ты можешь сделать:
gdb program_name program_pid
Ярлык будет (при условии, что запущен только один экземпляр):
gdb program_name `pidof program_name`
program_name
работает, если вы находитесь в том же каталоге, что и двоичный файл. Я думаю, что путь к двоичному файлу будет работать, если вы находитесь в другом каталоге.
-p
перед program_id
? Кроме того, может потребоваться запустить gdb с sudo для подключения к запущенному процессу.
Используемая команда: gdb attach pid
pid - это идентификатор процесса, к которому вы хотите подключиться.
Да, ты можешь. Предположим, что процесс foo
запущен ...
ps -elf | grep foo ищите номер PID gdb -a {номер PID}
Если кто-то хочет присоединить процесс, у этого процесса должен быть тот же владелец. Корень может подключаться к любому процессу.
ps -elf, похоже, не показывает PID. Я рекомендую вместо этого использовать:
ps -ld | grep foo
gdb -p PID
Самый простой способ - предоставить идентификатор процесса .
gdb -p `pidof your_running_program_name`
Пожалуйста, получите полный список опций в man gdb
команде.
Если для одной и той же программы выполняется несколько процессов, следующая команда выведет список этих процессов.
ps -C program -o pid h
<number>
Затем идентификатор процесса вывода (номер) можно использовать в качестве аргумента для gdb.
gdb -p <process id>