Answers:
是。使用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.
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
。
您可以使用附加到正在运行的进程gdb -p PID
。
是。你可以做:
gdb program_name program_pid
一种快捷方式是(假设仅在运行一个实例):
gdb program_name `pidof program_name`
program_name
如果您与二进制文件位于同一目录中,则该方法有效。我认为,如果您在其他目录中,则二进制文件的路径将起作用。
-p
前面的program_id
吗?另外,可能有必要使用sudo运行gdb来附加到正在运行的进程。
要使用的命令是gdb attach pid
pid是要附加到的进程的进程ID。
ps -elf似乎没有显示PID。我建议改用:
ps -ld | grep foo
gdb -p PID