我可以使用 GDB 来调试正在运行的进程吗?

在 linux 下,我可以使用 GDB 来调试当前正在运行的进程吗?

198677 次浏览

是的。使用 attach命令。查看 这个链接了解更多信息。在 GDB 控制台上输入 help attach会得到以下结果:

(gdb) help attach

附加到 GDB 之外的进程或文件。 此命令附加到另一个目标,其类型与上一个目标相同 “ target”命令(“ info files”将显示目标堆栈)。 该命令可以采用进程 ID 作为参数,即进程名 (使用可选的 process-id 作为后缀)或设备文件。 对于进程 id,必须具有向进程发送信号的权限, 它必须具有与调试器相同的有效 uid。 当对现有进程使用“ attach”时,调试器会找到 在程序运行的过程中,首先查看当前工作 目录,或者(如果没有找到)使用源文件搜索路径 (请参阅“ directory”命令) 指定程序,并加载其符号表。


注意: 由于 提高了 Linux 内核的安全性,您可能难以附加到进程-例如,从一个 shell 附加到另一个 shell 的子进程。

您可能需要根据需要设置 /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.

要使用的命令是 gdb attach pid,其中 pid 是要附加到的进程的进程 id。

可以使用 gdb -p PID附加到正在运行的进程。

是的,您可以。假设进程 foo正在运行..。

ps -elf | grep foo


look for the PID number


gdb -a {PID number}

是的,你可以这样做:

gdb program_name program_pid

一个快捷方式是(假设只有一个实例在运行) :

gdb program_name `pidof program_name`

Ps- 精灵似乎没有显示出 PID。 我建议使用:

ps -ld | grep foo
gdb -p PID

如果要附加进程,该进程必须具有相同的所有者。根目录可以附加到任何进程。

最简单的方法是提供 程序编号

gdb -p `pidof your_running_program_name`

请在 man gdb命令中获得选项的完整列表。

如果同一个程序有多个进程在运行,那么下面的命令将列出这些进程。

ps -C program -o pid h
<number>

然后输出 程序编号(number)可以用作 gdb 的参数。

gdb -p <process id>