Gdb 中的多个命令由某种分隔符‘ ;’分隔开?

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

finish; next

我尝试使用“ ;”来分隔命令,但 gdb 不允许我同时执行这两个命令。

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

50800 次浏览

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

(gdb) define fn
> finish
> next
> end

然后输入:

(gdb) fn

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

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

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

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

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

我使用 BashHere 文档在 GDB 中运行 另一种方式来执行多个命令。

例如:

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

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

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

当然有可能,例如,给定 C 代码

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

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

    • 任何 第一个非空格字符#的提示符都可以工作: 正好 #在 GDB 命令脚本中启动注释。
    • 默认情况下,将 GDB附录转换为日志文件; 选择 覆盖可以让我们稍后使用不同的命令轻松地再次部署这个技巧。
    • 也就是说,只将类型化命令的输出保存到日志文件中: 不要在终端也显示它。(这对我们的目的来说并非绝对必要,但可以减少杂乱。)
    • 这会导致 GDB 开始实际记录日志; 默认情况下,日志文件称为 gdb.txt
    • 我们的3个 whatis请求,按照承诺的 在一条线上输入! 在第一个命令之前和最后一个命令之后分别是 \n
    • 完成写入 gdb.txt; 该文件现在包含一个有效的 GDB 命令脚本:
   #gdb#
whatis a
whatis b
whatis c
#gdb#
    • GDB 现在在它刚刚生成的脚本中执行命令,产生预期的结果:
type = int
type = double
type = short

笔记

  • 如果您希望在相同的 GDB 会话中再次部署这个技巧,只需执行步骤4-7。
  • 使用 shell生成命令脚本不会那么麻烦,而且很有可能; 但是,上面的方法是与平台无关的。

链接描述 gdb“用户定义的命令”,并包含上面提到的解决方案。

我过去常常只是将多个命令以多行形式从 txt file 复制粘贴到 gdb 命令行,它在 gdb 8.3中工作得很好。 但是 gdb 12.1只是将整个代码块(包括行更改)解释为一个命令,并且失败。