Debugging gdb中由某种分隔符分隔的多个命令'';?

Debugging gdb中由某种分隔符分隔的多个命令'';?,debugging,gdb,Debugging,Gdb,我试图在gdb中同时执行两个命令: finish; next 我试着用“;”但gdb不允许我同时执行这两个命令 是否可以在gdb中执行类似于用“;”分隔的bash命令的多个命令分隔符?我不这么认为(但我可能错了)。您可以这样做: (gdb) define fn > finish > next > end (gdb)定义fn >完成 >下一个 >结束 然后键入: (gdb) fn (gdb)fn 您也可以将它放在~/.gdbinit文件中,这样它总是可用的。GDB没有这样的命令分隔符。我简单地看

我试图在gdb中同时执行两个命令:

finish; next
我试着用“;”但gdb不允许我同时执行这两个命令

是否可以在gdb中执行类似于用“;”分隔的bash命令的多个命令分隔符?

我不这么认为(但我可能错了)。您可以这样做:

(gdb) define fn > finish > next > end (gdb)定义fn >完成 >下一个 >结束 然后键入:

(gdb) fn (gdb)fn
您也可以将它放在
~/.gdbinit
文件中,这样它总是可用的。

GDB没有这样的命令分隔符。我简单地看了一下,以防添加一个很容易,但不幸的是没有…

如果您从命令行运行gdb,您可以使用-ex参数传递多个命令,如:

$ gdb ./prog -ex 'b srcfile.c:90' -ex 'b somefunc' -ex 'r -p arg1 -q arg2'
这与显示和其他命令相结合,使得运行gdb变得不那么麻烦

我使用Bash-HERE文档在GDB中运行了多个命令

例如:

cat << EOF | gdb
print "command_1"
print "..."
print "command_n"
EOF

cat您可以使用
gdb
中的python集成来实现这一点

如果
s;bt
步进,然后打印回溯,但它没有

您可以通过调用Python解释器来完成同样的事情

python导入gdb;打印(gdb.execute(“s”));打印(gdb.execute(“bt”))

可以将其封装为一个专用命令,这里称为“cmds”,由python定义支持

下面是一个示例
.gdbinit
,它通过一个函数扩展以运行多个命令

# multiple commands
python
from __future__ import print_function
import gdb


class Cmds(gdb.Command):
  """run multiple commands separated by ';'"""
  def __init__(self):
    gdb.Command.__init__(
      self,
      "cmds",
      gdb.COMMAND_DATA,
      gdb.COMPLETE_SYMBOL,
      True,
    )

  def invoke(self, arg, from_tty):
    for fragment in arg.split(';'):
      # from_tty is passed in from invoke.
      # These commands should be considered interactive if the command
      # that invoked them is interactive.
      # to_string is false. We just want to write the output of the commands, not capture it.
      gdb.execute(fragment, from_tty=from_tty, to_string=False)
      print()


Cmds()
end
调用示例:

$ gdb
(gdb) cmds echo hi ; echo bye
hi
bye

当然这是可能的。例如,给定C代码

int a = 3;
double b = 4.4;
short c = 555;
,假设我们想询问GDB每个变量的类型。以下GDB命令序列将允许我们在一行中输入3个
whatis
请求:

  • 设置提示#gdb#
    • 任何第一个非空白字符为
      #
      的提示都会起作用:恰好
      #
      在GDB命令脚本中启动注释
  • 设置日志覆盖
    • 默认情况下,GDB附加到日志文件;选择覆盖可以让我们稍后使用不同的命令轻松地再次部署此技巧
  • 打开日志重定向设置
    • 也就是说,只将键入命令的输出保存到日志文件:不要在终端上显示它。(对于我们的目的来说,这不是绝对需要的,但可以减少混乱。)
  • 设置登录
    • 这导致GDB开始实际记录日志;默认情况下,日志文件名为
      gdb.txt
  • printf“\n什么是a\n什么是b\n什么是c\n”
    • 我们的3个
      whatis
      请求,按承诺在一行中输入!在第一个命令之前和最后一个命令之后分隔命令是
      \n
  • 设置注销
    • 写入
      gdb.txt
      ;该文件现在包含有效的GDB命令脚本:
  • source gdb.txt
    • GDB现在在刚刚生成的脚本中执行命令,产生预期的结果:

  • 笔记
    • 如果您希望在同一GDB会话中再次部署此技巧,只需执行步骤4-7
    • 使用
      shell
      生成命令脚本将不那么麻烦,而且很有可能;然而,上述方法是平台不可知的

    这描述了gdb“用户定义的命令”,并包含上述解决方案。

    调用gdb只是为了打印调用程序的堆栈跟踪时的错误方法:
    execlp(“gdb”、“gdb”、“-batch”、“-n”、“-ex”、“bt-full”,…
    我无法关闭分页。如果您忘记了如何定义函数,您可以使用
    show user
    查看其源代码,例如
    show user fn
    .brilliant,因为它允许从剪贴板粘贴命令并执行它。
       #gdb#
       whatis a
       whatis b
       whatis c
       #gdb#
    
    type = int
    type = double
    type = short