在GDB上运行程序时,通常在run命令中给出程序的参数。是否有一种方法可以使用GDB运行程序,并在shell脚本中给出参数?
run
我在一个相关问题中看到了答案,提到我们可以在脚本开始执行后将GDB附加到程序。但之后我将不得不“等待”程序。
还有别的办法吗?
你可以创建一个带有context的文件:
run arg1 arg2 arg3 etc program input
并调用gdb like
gdb prog < file
你可以使用--args参数运行gdb:
--args
gdb --args executablename arg1 arg2 arg3
如果您经常这样做(例如,当从脚本运行GDB时),您可能需要考虑以下参数以进一步实现自动化。首先,您可以将GDB命令(例如'run')放在一个文本文件中,并将文件名提供给-x参数。其次,通过提供--batch参数,可以让GDB在运行命令后退出。完整的例子:
-x
--batch
gdb -x commands.txt --batch --args executablename arg1 arg2 arg3
gdb -ex=r --args myprogram arg1 arg2
-ex=r是-ex=run的缩写,它告诉gdb立即运行程序,而不是等待您在提示符下键入“run”。然后--args表示后面的所有内容都是命令和参数,就像您通常在命令行提示符中键入它们一样。
-ex=r
-ex=run
另一种方法,我个人认为稍微更方便和直观(不需要记住--args参数),是正常编译,并直接从gdb中使用r arg1 arg2 arg3,如下所示:
gdb
r arg1 arg2 arg3
$ gcc -g *.c *.h $ gdb ./a.out (gdb) r arg1 arg2 arg3
gdb有--init-command <somefile>,其中somefile有一个gdb命令列表要运行,我使用这个在我的代码中有//GDB注释,然后'
--init-command <somefile>
//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
作为脚本,该脚本放置加载调试符号的命令,然后生成一个中断命令列表,为每个//GDB注释放置断点,并开始运行
除了Hugo Ideler的答案。 当使用自己有前缀的参数,如--或-时,我不确定是否与gdb one冲突
--
-
似乎gdb将args选项之后的所有选项都作为程序的参数。
args
起初我想要确定,我运行gdb与你的args周围的引号,它在启动时被删除。
这也可以,但可选:
gdb --args executablename "--arg1" "--arg2" "--arg3"
这行不通:
gdb --args executablename "--arg1" "--arg2" "--arg3" -tui
在这种情况下,-tui被用作我的程序参数,而不是作为gdb 1。
-tui
如果--args参数在您的机器上不起作用(即在Solaris 8上),您可以像这样启动gdb
gdb -ex "set args <arg 1> <arg 2> ... <arg n>"
你可以将此与输入文件到stdin和“立即运行”结合起来:
gdb -ex "set args <arg 1> <arg 2> ... <arg n> < <input file>" -ex "r"
太迟了,但是这里有一个在gdb会话期间工作的方法。
# EYZ0
然后
这将返回大量的匹配,一个有用的是set args。
set args
set args -- Set argument list to give program being debugged when it is started.
这将运行程序,将参数和参数计数传递给main(argc, argv)。
如果你想从文件中传递参数, 例如,scanf从文件作为输入
试试这个
(gdb) run < the_file_contains_data