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

时间:2009-08-11 20:11:16

标签: debugging gdb

我试图在gdb中一次执行两个命令:

finish; next

我尝试使用';'分开命令,但gdb不允许我同时做两件事。

是否可以在gdb中执行多个命令,类似于以';'分隔的bash命令定界符?

7 个答案:

答案 0 :(得分:159)

我不相信(但我可能错了)。你可以这样做:

(gdb) define fn
> finish
> next
> end

然后输入:

(gdb) fn

您可以将其放在~/.gdbinit文件中,以便始终可用。

答案 1 :(得分:36)

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

$ gdb ./prog -ex 'b srcfile.c:90' -ex 'b somefunc' -ex 'r -p arg1 -q arg2'

这与显示和其他命令相结合使得运行gdb变得不那么繁琐。

答案 2 :(得分:8)

GDB没有这样的命令分隔符。我简短地看了一下,如果添加一个很容易,但不幸的是没有....

答案 3 :(得分:5)

您可以使用gdb中的python集成来做到这一点。

如果s ; bt步进然后打印回溯记录,那会很好,但事实并非如此。

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

python import gdb ; print gdb.execute("s") ; print 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

答案 4 :(得分:2)

当然可以。例如,给定C代码

int a = 3;
double b = 4.4;
short c = 555;

,说我们想问GDB每个变量的类型是什么。以下GDB命令序列将使我们可以在一行上全部输入3个whatis请求:

  1. set prompt #gdb#
    • 第一个非空白字符#的任何提示都将起作用:恰好发生#在GDB命令脚本中开始注释的情况。
  2. set logging overwrite on
    • 默认情况下,GDB 追加到日志文件;选择改用 overwrite 可以使我们稍后使用不同的命令轻松地再次部署此技巧。
  3. set logging redirect on
    • 意思是,将键入命令的输出仅保存到日志文件中:不要在终端上也显示它。 (对于我们的目的而言,这不是绝对必需的,但是可以减少混乱。)
  4. set logging on
    • 这会导致GDB开始实际记录日志;默认情况下,该日志文件名为gdb.txt
  5. printf "\nwhatis a\nwhatis b\nwhatis c\n"
    • 我们的3个whatis请求,按承诺输入了行!在第一个命令之前和最后一个命令之后分别是\n
  6. set logging off
    • 已写至gdb.txt;该文件现在包含有效的GDB命令脚本:
   #gdb#
   whatis a
   whatis b
   whatis c
   #gdb#
  1. source gdb.txt
    • GDB现在在刚生成的脚本中执行命令,从而产生预期的结果:
type = int
type = double
type = short

注释

  • 您是否希望在同一GDB会话中再次部署此技巧,只需执行步骤4-7。
  • 使用shell生成命令脚本将不那么麻烦,并且很可能实现;但是,上述方法与平台无关。

答案 5 :(得分:0)

我跑过another way使用Bash HERE文档在GDB中执行多个命令。

示例:

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

这具有有限的价值/可用性IMO,因为GDB在执行命令列表后退出。

答案 6 :(得分:0)

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