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

Jus*_*ier 107 linux debugging gdb

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

Nik*_*sov 105

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


Car*_*rum 83

是.使用该attach命令.有关更多信息,请查看此链接.help attach在GDB控制台上键入以下内容:

(gdb) help attach
Run Code Online (Sandbox Code Playgroud)

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


注意:由于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.
Run Code Online (Sandbox Code Playgroud)

  • 链接坏了:(从我的观点来看,我喜欢[J. Polfer](http://stackoverflow.com/)的答案[http://stackoverflow.com/a/2702170/938111] users/40411/j-polfer).干杯;) (8认同)
  • 可以使用 `echo 0 | 更改标志。须藤 tee /proc/sys/kernel/yama/ptrace_scope`。 (2认同)

J. *_*fer 23

是.你可以做:

gdb program_name program_pid
Run Code Online (Sandbox Code Playgroud)

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

gdb program_name `pidof program_name`
Run Code Online (Sandbox Code Playgroud)

  • 你是不是忘记了“program_id”前面的“-p”?此外,可能需要使用 sudo 运行 gdb 才能附加到正在运行的进程。 (3认同)
  • 我发现这最有效,因为它除了附加到进程外还加载了符号表.应该注意,如果您与二进制文件位于同一目录中,`program_name`将起作用.我认为如果您在不同的目录中,二进制文件的路径将起作用. (2认同)

Dav*_*rek 14

要使用的命令是gdb attach pidpid是要附加到的进程的进程ID.


shu*_*uva 9

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

gdb -p `pidof your_running_program_name`
Run Code Online (Sandbox Code Playgroud)

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

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

ps -C program -o pid h
<number>
Run Code Online (Sandbox Code Playgroud)

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

gdb -p <process id>
Run Code Online (Sandbox Code Playgroud)