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

标签 linux shell 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 attach 命令需要进程 ID 作为参数。所以,你不能直接实现它。您可以分两步完成:

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

但是gdb相当灵活,可以是extended使用内部脚本(称为命令的 jar 装序列)、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

关于linux - 如何在 GDB 中使用 shell 命令的输出作为 GDB 命令的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36004373/

相关文章:

linux - 从 Red Hat Linux 收集系统数据

linux - 在 C 中,在 Linux 中工作,什么时候越界访问数组会导致段错误?

ruby - 在 ruby​​ 中安装 Rack gem 时出错

shell - 如何在 Bourne Shell 中比较字符串?

linux - 在脚本中对多个文件使用 sed

android - 无法从 adb shell 运行可执行文件

c++ - gdb 映射显示不正确的成员变量

windows - mxmlc 在 linux 和 windows 下编译不同?

c++ - gdb 核心转储打开失败

c - AIX 6.1 上的 GDB 没有 TUI 模式吗?