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

我不想花时间search我想要附加的进程的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 attach命令需要进程ID作为参数。 所以,你不能直接实现。 您可以分两步进行:

 (gdb) shell pidof foo 12345 (gdb) attach 12345 Attaching to process 12345 ... 

但gdb非常灵活,可以通过内部脚本(称为Canned Sequences of Commands),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'ing文件,然后用源代码运行)。 此外,我正在使用echo $(pidof <>)0提供默认值0时,找不到进程。

把这个放在〜/ .gdbinit等gdb start上,这个命令会自动加到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