GDB 附加命令需要进程ID作为参数。 因此,您无法直接实现它。 您可以分两个步骤进行操作:
(gdb) shell pidof foo
12345
(gdb) attach 12345
Attaching to process 12345
...
但是gdb非常灵活,可以用内部脚本(称为命令序列),python等进行扩展 。这是一个示例脚本,它还可以处理找不到进程或找到多个进程时的情况(由pidof指定的第一个是选择):
define attach_pidof
if $argc != 1
help attach_pidof
else
shell echo -e "\
set \$PID = "$(echo $(pidof $arg0) 0 | cut -d ' ' -f 1)"\n\
if \$PID > 0\n\
attach "$(pidof -s $arg0)"\n\
else\n\
print \"Process '"$arg0"' not found\"\n\
end" > /tmp/gdb.pidof
source /tmp/gdb.pidof
end
end
document attach_pidof
Attach to process by name.
Usage: attach_pidof PROG_NAME
end
在这里,我使用了@ dbrank0指出的技巧(回显文件,然后使用源代码运行它)。 此外,当未找到任何进程时,我正在使用echo $ {pidof <>)0提供默认值0。
将此放置到〜/ .gdbinit中,以便在gdb启动时,此命令将自动添加到gdb并可以使用:
(gdb) attach_pidof myprog
如果您的gdb支持python扩展名,则可以将其放置到某个文件中,例如ext.py :
import gdb
from subprocess import check_output, CalledProcessError
class AttachPidofCommand (gdb.Command):
"Attach to process by name"
def __init__ (self):
super (AttachPidofCommand, self).__init__ ("attach_pidof",
gdb.COMMAND_SUPPORT,
gdb.COMPLETE_NONE, True)
def invoke (self, arg, from_tty):
try:
pid = check_output(["pidof", arg]).split()[0].decode("utf-8")
except CalledProcessError:
gdb.write('process \'%s\' not found\n' % (arg))
return
gdb.write('attach to \'%s\' (%s)\n' % (arg, pid))
gdb.execute('attach %s' % (pid), from_tty)
AttachPidofCommand()
导入和使用相同的方式:
(gdb) source ext.py
(gdb) attach_pidof my_prog