如何在Bash脚本中使用GDB运行带有命令行参数的程序?
在GDB上运行程序时,程序的参数通常在如何在Bash脚本中使用GDB运行带有命令行参数的程序?,gdb,command-line-arguments,Gdb,Command Line Arguments,在GDB上运行程序时,程序的参数通常在run命令中给出。有没有一种方法可以使用GDB运行程序,并在shell脚本中提供参数 我在一个相关问题中看到了答案,提到我们可以在脚本开始执行后将GDB附加到程序。但接下来我将不得不“等待”节目 还有其他方法吗?您可以使用上下文创建一个文件: run arg1 arg2 arg3 etc program input 然后像这样调用gdb gdb prog < file gdb prog
run
命令中给出。有没有一种方法可以使用GDB运行程序,并在shell脚本中提供参数
我在一个相关问题中看到了答案,提到我们可以在脚本开始执行后将GDB附加到程序。但接下来我将不得不“等待”节目
还有其他方法吗?您可以使用上下文创建一个文件:
run arg1 arg2 arg3 etc
program input
然后像这样调用gdb
gdb prog < file
gdb prog
您可以使用--args参数运行gdb
gdb --args executablename arg1 arg2 arg3
如果希望它自动运行,请在文件中放置一些命令(例如“run”),并将其作为参数:-x/tmp/cmds。您也可以选择以批处理模式运行
gdb -batch -x /tmp/cmds --args executablename arg1 arg2 arg3
-ex=r
是-ex=run
的缩写,它告诉gdb立即运行您的程序,而不是等待您在提示符处键入“run”。然后,--args
说接下来的所有内容都是命令和参数,就像您通常在命令行提示符下键入它们一样。另一种方法是正常编译,我个人觉得它更方便、更直观(无需记住--args
参数),并从gdb
中直接使用r arg1 arg2 arg3
,如下所示:
$ gcc -g *.c *.h
$ gdb ./a.out
(gdb) r arg1 arg2 arg3
gdb有--init command
其中somefile有一个要运行的gdb命令列表,我使用它在代码中有//gdb
注释,然后`
echo "file ./a.out" > run
grep -nrIH "//GDB"|
sed "s/\(^[^:]\+:[^:]\+\):.*$/\1/g" |
awk '{print "b" " " $1}'|
grep -v $(echo $0|sed "s/.*\///g") >> run
gdb --init-command ./run -ex=r
作为一个脚本,它放置命令以加载调试符号,然后生成一个break命令列表,为每个
//GDB
注释放置一个断点,并在Hugo Ideler的回答之外启动它运行。
当使用具有自身前缀的参数时,如--
或-
,我不确定是否与gdb one冲突
gdb似乎将all afterargs
选项作为程序的参数
首先,我想确认一下,我在运行gdb时在args周围加了引号,它在启动时就被删除了
这也可以,但可以选择:
gdb --args executablename "--arg1" "--arg2" "--arg3"
这不起作用:
gdb --args executablename "--arg1" "--arg2" "--arg3" -tui
在这种情况下,-tui
被用作我的程序参数,而不是gdb one。如果--args
参数在您的机器上不工作(即在Solaris 8上),您可以像这样启动gdb
gdb -ex "set args <arg 1> <arg 2> ... <arg n>"
gdb-ex“设置参数…”
您可以将此与向stdin输入文件和“立即运行”结合使用:
gdb-ex“设置参数…”<“-ex”r”
太晚了,但是这里有一个方法可以在gdb
会话期间工作
gdb
然后
(gdb)恰当的参数
这将返回许多匹配项,有用的是set args
set args -- Set argument list to give program being debugged when it is started.
设置args arg1 arg2…
然后
r
这将运行程序,将参数和参数计数传递给main(argc,argv)。Argg,
mangdb
不包含--args
,这就是我没有找到它的原因<代码>gdb--help有帮助。@CiroSantilli新疆改造中心法轮功六四事件 GDB是GNU。要查看GNU工具的完整文档,请记住下次使用info-gdb
:-)。@Apteryx也许有一天我会学习info
。如果Google或堆栈溢出停止工作XD@CiroSantilli新疆改造中心法轮功六四事件 在发现“I”键(索引搜索
)后,我迷上了信息。尝试:info-gdb
,然后是“i”,然后是“--args”。它会把你带到它。这可能是重复的,这正是OP希望避免的。嗯,是的,谢谢你,公平点。我不知道我怎么这么长时间没有注意到这一点。不过,我想我会把答案留在这里,因为iirc,当我在谷歌上搜索“如何使用gdb传递命令行参数”之类的内容时,我偶然发现了这个问题,发现答案不见了,我继续添加它,但没有意识到(将近一年!)“我的答案并没有解决眼前的问题。”KarateSnowMachine作为一个来自谷歌的人,这个答案更符合我的要求。也许我们应该把问题修改得更一般,因为它有这样一个一般性的标题,或者我们应该缩小标题。减少限制可能对更多的读者更有用。不知道-exe=r
非常有用@雨果太棒了!非常感谢。有用!
gdb -ex "set args <arg 1> <arg 2> ... <arg n> < <input file>" -ex "r"
set args -- Set argument list to give program being debugged when it is started.