在使用GDB运行程序时,通常需要在run
命令中输入程序的参数。是否有一种方法可以在shell脚本中同时使用GDB运行程序并提供参数呢?
我在相关问题的答案中看到一个说法,提到我们可以在脚本开始执行后将GDB附加到程序上。但这样我就必须“等待”程序。
还有其他方法吗?
在使用GDB运行程序时,通常需要在run
命令中输入程序的参数。是否有一种方法可以在shell脚本中同时使用GDB运行程序并提供参数呢?
我在相关问题的答案中看到一个说法,提到我们可以在脚本开始执行后将GDB附加到程序上。但这样我就必须“等待”程序。
还有其他方法吗?
您可以使用--args
参数运行gdb:
gdb --args executablename arg1 arg2 arg3
如果你经常这样做(例如从脚本中运行GDB),你可以考虑以下参数以进一步自动化。首先,你可以将GDB命令(如“run”)放在文本文件中,并将文件名提供给-x
参数。其次,你可以通过提供--batch
参数使GDB在运行完你的命令后退出。一个完整的例子:
gdb -x commands.txt --batch --args executablename arg1 arg2 arg3
man gdb
中找到 --args
选项,所以找不到它。但是在 gdb --help
中有提到。 - Ciro Santilli OurBigBook.comguix shell gdb info-reader -- info gdb
,然后从那里开始使用i RET --args
序列。 - Apteryxgdb -ex=r --args myprogram arg1 arg2
-ex=r
是-ex=run
的缩写,告诉gdb立即运行您的程序,而不是等待您在提示符处键入"run"。然后--args
表示接下来的所有内容都是命令和参数,就像您通常在命令行提示符下键入的那样。
-exe=r
这个选项,非常有用! - Jeefgdb --args -ex=r myprogram arg1 arg2
。 - x-yuri另一种方法,我个人认为更加方便和直观(不需要记住--args
参数),是正常编译,然后在gdb
中直接使用r arg1 arg2 arg3
,如下所示:
$ gcc -g *.c *.h
$ gdb ./a.out
(gdb) r arg1 arg2 arg3
你可以创建一个带有上下文的文件:
run arg1 arg2 arg3 etc
program input
并且像这样调用 gdb:
gdb prog < file
--
或-
,我不确定是否会与gdb发生冲突。args
选项后面的所有内容都视为程序的参数。gdb --args executablename "--arg1" "--arg2" "--arg3"
这个不起作用:
gdb --args executablename "--arg1" "--arg2" "--arg3" -tui
-tui
作为我的程序参数而不是 gdb 的参数被使用。虽然有点晚了,但这里提供一种在会话期间有效的方法。
gdb <可执行文件>
然后输入
(gdb) apropos argument
这将返回大量匹配项,其中有用的是set args
。
set args -- Set argument list to give program being debugged when it is started.
set args arg1 arg2 ...
然后
r
这将运行程序,并将参数和参数计数传递给main(argc, argv)。
--args
参数无法使用,您可以这样启动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有一个--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
作为一个脚本,它先放置命令来加载调试符号,然后生成一系列断点命令,为每个 //GDB
注释设置断点,并启动它运行。
(gdb) run < the_file_contains_data