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


Answers:


88

是。使用attach命令。查看此链接以获取更多信息。打字help attach在GDB控制台提供了以下:

(gdb) help attach

附加到GDB外部的进程或文件。该命令将附加到另一个目标,该目标的类型与您上一个“ target”命令的类型相同(“ info files”将显示目标堆栈)。该命令可以将进程ID,进程名称(带有可选的进程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.

8
该链接被打破:(从我的角度来看,我喜欢去回答这样一个J.波尔费尔干杯)。
olibre

我已经修复了链接。
阿提

这对远程目标上的进程的pid也有效吗?
Bionix1441

然后,您必须在远程目标上运行调试服务器。之后应该是一样的。
卡尔·诺鲁姆

可以使用更改标志echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
荒木大辅


24

是。你可以做:

gdb program_name program_pid

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

gdb program_name `pidof program_name`

我不知道该怎么办,但可以肯定,因为地狱对我不起作用。它说<program_pid>不存在。
猫头鹰

2
我发现这最有效,因为除了附加到进程外,它还加载符号表。应该注意的是,program_name如果您与二进制文件位于同一目录中,则该方法有效。我认为,如果您在其他目录中,则二进制文件的路径将起作用。
KarateSnowMachine

您不是忘了-p前面的program_id吗?另外,可能有必要使用sudo运行gdb来附加到正在运行的进程。
mxmlnkn


3

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

ps -elf | grep foo

查找PID号

gdb -a {PID号}

5
您正在运行什么发行版?使用最新版本的Fedora,“ gdb -a”会显示“ -a模棱两可”的错误。
贾斯汀·埃斯蒂尔

1
官方论点是-p /
-pid



2

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

gdb -p `pidof your_running_program_name`

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

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

ps -C program -o pid h
<number>

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

gdb -p <process id>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.