在 emacs 中执行多个 gdb 命令

execute multiple gdb commands in emacs

如果有一种方法可以在 gdb 中本地执行此操作,例如 'load script',那么请忽略此问题的 emacs 部分。

我经常在一个相当高的循环中执行以下操作:

  1. 启动 gdb(如果有帮助,在 emacs 中启动)。
  2. 设置几个断点(每次都设置相同的断点)。通常必须输入 "y" 我想在将来加载共享库时设置断点。
  3. 设置一些观察点(相同的观察点)
  4. 调试一下。
  5. 关闭 gdb。
  6. 转到 1.

因此,如果我可以保存写入缓冲区或文件的命令,并在每次启动 gdb 时加载并执行该组命令,那将使我的生活变得更加轻松。如果我不必输入 "y" 来确认 gdb 应该在未来的库加载时使断点挂起,那么奖励积分。

如果我能保存所有当前断点(按名称而不是按地址,因为那些可能会改变),那将是非常棒的。

好吧,我想你可以通过 set history save

保存命令历史记录

同题型的正确解释如下link

How can I make gdb save the command history?

您可以将所有命令放在一个文件中,然后使用参数 -x /path/to/file 调用 gdb。任何问题的答案都将默认为安全...

$ cat init.gdb
break write

$ gdb -q -x init.gdb a.out
Reading symbols from a.out...done.
Function "write" not defined.
Make breakpoint pending on future shared library load? (y or [n]) [answered N;
    input not from terminal]
(gdb)

但在这种情况下,您希望答案为 y。通常可以设置一个 gdb 变量来覆盖默认选择。这里是 set breakpoint pending on.

$ cat init2.gdb
set breakpoint pending on
break write

$ gdb -q -x init2.gdb a.out
Reading symbols from a.out...done.
Function "write" not defined.
Breakpoint 1 (write) pending.
(gdb) 

要保存断点,使用save breakpoints命令。

(gdb) save breakpoints bp.gdb
Saved to file 'bp.gdb'.
(gdb) quit
$ cat bp.gdb
break write

除了上述之外,gdb会自动加载一个脚本文件。确切加载哪个文件取决于 gdb 版本,但在旧版本中,它读取当前目录中的 .gdbinit;在较新的版本中将显示为“$EXE-gdb.gdb”,其中 $EXE 是您正在调试的程序的名称。有关所有详细信息,请参阅手册。