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

问题描述 投票:0回答:8

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

linux debugging gdb
8个回答
149
投票

您可以使用

gdb -p PID
附加到正在运行的进程。


111
投票

是的。使用

attach
命令。查看此链接了解更多信息。在 GDB 控制台中输入
help attach
将显示以下内容:

(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.

34
投票

是的。你可以这样做:

gdb program_name program_pid

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

gdb program_name `pidof program_name`

16
投票

要使用的命令是

gdb attach pid
,其中 pid 是要附加到的进程的进程 ID。


9
投票

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

gdb -p `pidof your_running_program_name`

请在

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

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

ps -C program -o pid h
<number>

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

gdb -p <process id>

4
投票

是的,你可以。假设进程

foo
正在运行...

ps -精灵 | grep foo

寻找PID号

gdb -a {PID号}

3
投票

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


2
投票

ps -elf 好像没有显示PID。 我建议使用:

ps -ld | grep foo
gdb -p PID
© www.soinside.com 2019 - 2024. All rights reserved.