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

camsedfj  于 2022-11-24  发布在  其他
关注(0)|答案(8)|浏览(201)

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

finish; next

我试着用了"; '来分隔命令,但gdb不允许我同时执行这两个命令。
是否可以在gdb中执行多个类似于bash命令的命令,并以'; '分隔符号?

svujldwt

svujldwt1#

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

(gdb) define fn
> finish
> next
> end

然后键入:

(gdb) fn

你也可以把它放在你的~/.gdbinit文件中,这样它就总是可用的。

z18hc3ub

z18hc3ub2#

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

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

这与display和其他命令结合使用,使得运行gdb变得不那么麻烦。

jtw3ybtb

jtw3ybtb3#

您可以使用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
5lhxktic

5lhxktic4#

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

w41d8nur

w41d8nur5#

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

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

,假设我们想问GDB每个变量的类型是什么。下面的GDB命令序列将允许我们在一行中输入3个whatis请求:

  • set prompt #gdb#
    • 第一个非空白字符 * 为#的任何提示符都可以使用:恰好#在GDB命令脚本中启动了一个注解。
  • set logging overwrite on
  • 默认情况下,GDB * 将 * 追加到日志文件中;选择 overwrite 可以让我们在以后用不同的命令轻松地再次部署这个技巧。
  • set logging redirect on
  • 这意味着,仅将键入命令的输出保存到日志文件:也不要在终端显示它。(对于我们的目的来说不是绝对需要的,但要保持混乱。)
  • set logging on
  • 这将导致GDB开始实际记录;缺省情况下,日志文件名为gdb.txt
  • printf "\nwhatis a\nwhatis b\nwhatis c\n"
  • 我们的3个whatis请求,在一行中输入正如所承诺的!将命令分开,在第一个命令之前,在最后一个命令之后是\n
  • set logging off
  • 已完成写入gdb.txt;该文件现在包含一个有效的GDB命令脚本:
#gdb#
   whatis a
   whatis b
   whatis c
   #gdb#
  • source gdb.txt
  • GDB现在执行刚生成的脚本中的命令,产生预期的结果:
type = int
type = double
type = short

备注

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

wribegjk6#

我遇到了another way,使用Bash HERE文档在GDB中执行多个命令。
例如:

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

由于GDB在执行完命令列表后退出,因此这在IMO中的价值/可用性有限。

pengsaosao

pengsaosao7#

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

uplii1fm

uplii1fm8#

我过去只是将txt文件中多行的多个命令复制并粘贴到gdb命令行,在gdb 8.3中运行良好。但gdb 12.1只是将包括行更改在内的整个块解释为一个命令,并失败。

相关问题