繁体   English   中英

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

[英]How can I use the output of a shell command as an argument to GDB command within GDB?

我不想花时间搜索我要附加的流程的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中有类似的东西吗?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM