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

Posted

技术标签:

【中文标题】gdb中的多个命令由某种分隔符\';\'分隔?【英文标题】:Multiple commands in gdb separated by some sort of delimiter ';'?gdb中的多个命令由某种分隔符';'分隔? 【发布时间】:2010-11-18 18:11:07 【问题描述】:

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

finish; next

我尝试使用';'将命令分开,但 gdb 不允许我同时执行这两项操作。

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

【问题讨论】:

【参考方案1】:

这个link描述了gdb“用户定义的命令”并且包含了上面提到的解决方案。

【讨论】:

【参考方案2】:

当然可以。例如,给定 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.txtprintf "\nwhatis a\nwhatis b\nwhatis c\n" 我们的 3 个 whatis 请求,按承诺输入!分隔命令,第一个之前和最后一个之后是\nset 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 生成命令脚本会更简单,而且很有可能;但是,上述方法与平台无关。

【讨论】:

【参考方案3】:

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

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

示例:

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

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

【讨论】:

【参考方案5】:

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

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

加上 display 和其他命令,运行 gdb 变得不那么麻烦。

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

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

(gdb) 定义 fn > 完成 > 下一步 > 结束

然后只需输入:

(gdb) fn

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

【讨论】:

调用 gdb 只是为了打印调用者的堆栈跟踪时的错误方法:execlp("gdb", "gdb", "-batch", "-n", "-ex", "bt full", ... 我无法关闭分页。 如果你忘记了你是如何定义一个函数的,你可以使用show user &lt;function name&gt;查看它的源代码,例如show user fn.

以上是关于gdb中的多个命令由某种分隔符';'分隔?的主要内容,如果未能解决你的问题,请参考以下文章

Hive : 当列值由分隔符 (~) 分隔时,将单个记录扩展为多个记录

pandas中分隔符由多个字符组成

ggplot:使用一个共同的 y 轴由多个变量(而不是变量中的多个类别)分隔的多面板/平面散点图

Spring Data Solr - 由 OR 分隔的多个 FilterQueries

Qt生成CSV 文件

Javascript按带有分隔符的字符串中的字符串排序