通常,在GDB上运行程序时,程序的参数在run
命令中给出。有没有办法使用GDB运行程序,并在shell脚本中提供参数?
我在相关问题中看到了一个答案,提到我们可以在脚本开始执行后将GDB附加到程序中。但接下来我将不得不“等待”该计划。
还有另一种方法吗?
你可以使用--args参数运行gdb,
gdb --args executablename arg1 arg2 arg3
如果您希望它自动运行,请将一些命令放在一个文件中(例如'run')并将其作为参数:-x / tmp / cmds。您可以选择使用-batch模式运行。
gdb -batch -x /tmp/cmds --args executablename arg1 arg2 arg3
gdb -ex=r --args myprogram arg1 arg2
-ex=r
是-ex=run
的缩写,告诉gdb立即运行你的程序,而不是等你在提示符下输入“run”。然后--args
说接下来的一切都是命令和参数,就像你通常在命令行提示符下键入它们一样。
另一种方法,我个人觉得稍微更方便和直观(不必记住--args
参数),是正常编译,并直接从r arg1 arg2 arg3
使用gdb
,如下所示:
$ gcc -g *.c *.h
$ gdb ./a.out
(gdb) r arg1 arg2 arg3
您可以使用上下文创建文件:
run arg1 arg2 arg3 etc
program input
并调用gdb之类的
gdb prog < file
gdb有--init-command <somefile>
,其中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冲突。
似乎gdb将args
选项后的所有选项作为程序的参数。
起初我想确定,我在你的args周围用引号运行gdb,它在发布时被删除。
这也有效,但可选:
gdb --args executablename "--arg1" "--arg2" "--arg3"
这不起作用:
gdb --args executablename "--arg1" "--arg2" "--arg3" -tui
在这种情况下,-tui
用作我的程序参数而不是gdb。
如果--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"