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

时间:2010-02-22 03:39:49

标签: linux debugging gdb

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

8 个答案:

答案 0 :(得分:101)

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

答案 1 :(得分:78)

是。使用attach命令。有关详细信息,请查看this link。在GDB控制台上键入help attach将提供以下内容:

(gdb) help attach
     

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


注意:由于improved security in the Linux kernel,您可能难以附加到某个流程 - 例如,将一个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.

答案 2 :(得分:22)

是。你可以这样做:

gdb program_name program_pid

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

gdb program_name `pidof program_name`

答案 3 :(得分:14)

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

答案 4 :(得分:3)

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

ps -elf | grep foo

look for the PID number

gdb -a {PID number}

答案 5 :(得分:2)

ps -elf似乎没有显示PID。 我推荐使用:

ps -ld | grep foo
gdb -p PID

答案 6 :(得分:2)

如果想要附加进程,则此进程必须具有相同的所有者。 root可以附加到任何进程。

答案 7 :(得分:1)

最简单的方法是提供进程ID

gdb -p `pidof your_running_program_name`

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

如果同一程序正在运行有多个进程,则以下命令将列出这些进程。

ps -C program -o pid h
<number>

然后输出进程ID (数字)可用作gdb的参数。

gdb -p <process id>