如何在GDB中将shell命令输出作为GDB命令的参数使用?

3

我不想花时间搜索要附加到的进程的PID,所以我会像这样做:

gdb -p ($pidof foo)

其中foo是进程名称。

我想知道是否可以从GDB内部执行类似以下的操作。

我正在寻找以下类似内容。

(gdb) attach $(pidof foo)
Illegal process-id: $(pidof foo).
(gdb) attach `pidof foo`
Illegal process-id: `pidof foo`.

在GDB中有类似这样的东西吗?

看起来并不直接,但可以通过这里解释的hack实现:https://dev59.com/Smw15IYBdhLWcg3wA3AA - dbrank0
@dbrank0 很棒,根据你的想法编写了基于 canned seq 的代码(请查看我的回答)。 - pmod
1个回答

4

Gdb的attach命令需要进程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到文件中,然后使用source运行它)。此外,当没有找到进程时,我使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接