我试图在gdb中一次执行两个命令:
finish; next
我尝试使用';'分开命令,但gdb不允许我同时做两件事。
是否可以在gdb中执行多个命令,类似于以';'分隔的bash命令定界符?
答案 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
请求:
set prompt #gdb#
#
的任何提示都将起作用:恰好发生#
在GDB命令脚本中开始注释的情况。set logging overwrite on
set logging redirect on
set logging on
gdb.txt
。printf "\nwhatis a\nwhatis b\nwhatis c\n"
whatis
请求,按承诺输入了行!在第一个命令之前和最后一个命令之后分别是\n
。set logging off
gdb.txt
;该文件现在包含有效的GDB命令脚本:#gdb# whatis a whatis b whatis c #gdb#
source gdb.txt
type = int
type = double
type = short
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“用户定义的命令”并包含上述解决方案。