我搜索了很多类似的问题,但一无所获。运行 gdb 时,我无法使用向上箭头遍历以前的命令。向上和向下箭头被忽略。在更改某些设置后,我开始观察这种行为,但我不记得具体更改了哪些设置。
我没有~/.xinputrc
文件,$TERM
设置为xterm
.
这可能是因为您的历史记录大小为 0。
您可以检查您的 gdb 历史记录大小:
(gdb) show history size
The size of the command history is 0.
(gdb)
Run Code Online (Sandbox Code Playgroud)
如果历史最大大小为 0,则向上箭头当然不起作用,因为无法保存任何历史记录。
我发现的主要原因是因为 bash 环境变量 HISTSIZE 为 0 或为空。这很令人沮丧,因为我认为~/.bashrc 中的HISTSIZE=(右侧的空值)可以使 bash 历史记录保存无限条目,但副作用是 gdb 引用 $HISTSIZE 然后在 gdb 启动时将 gdb 历史记录大小设置为 0。
所以你可以把HISTSIZE=10000000放在你的 ~/.bashrc 上,向上箭头现在应该可以工作(警告: 在玩HISTSIZE之前备份你的 ~/ .bash_history):
(gdb) show history size
The size of the command history is 10000000.
(gdb)
Run Code Online (Sandbox Code Playgroud)
如果你坚持在 ~/.bashrc 上保持HISTSIZE= 为空,那么选项是在 ~/.bashrc 上创建这个函数:
gdb() ( HISTSIZE=70000000; /usr/bin/gdb "$@"; )
Run Code Online (Sandbox Code Playgroud)
. ~/.bashrc重新加载,现在它改变了:
(gdb) show history size
The size of the command history is 70000000.
(gdb)
Run Code Online (Sandbox Code Playgroud)
从 gdb 退出后,原来的 $HISTSIZE 不会被覆盖(即保持为空为无限制),因为我们的 gdb 函数使用子shell,即被括号包围,gdb() (...):
$ echo $HISTSIZE
$
Run Code Online (Sandbox Code Playgroud)
您还必须在退出时打开历史记录,然后考虑在哪里存储历史记录文件。以下是我的 ~/.gdbinit 文件,如果尚不存在,请创建它:
$ cat ~/.gdbinit
set environment HISTSIZE 10000000
set history filename ~/.gdb_history
set history save on
set history size 10000000
set history expansion on
show history
$
Run Code Online (Sandbox Code Playgroud)
您可能会问为什么设置环境 HISTSIZE 10000000不起作用?这是因为它只影响程序,而不是 gdb 本身,如页面http://www.delorie.com/gnu/docs/gdb/gdb_20.html 所示:
将环境变量 varname 设置为 value。该值仅针对您的程序更改,而不针对 GDB 本身。
补丁现已可用,请参阅https://sourceware.org/bugzilla/show_bug.cgi?id=16999:
2015-06-17 18:14:09 UTC:
...此补丁使无效 GDBHISTSIZE 的行为与 bash 处理 HISTSIZE 的方式一致。当我们遇到空值或超出范围的 GDBHISTSIZE(在 [0, INT_MAX] 之外)时,我们现在将历史大小设置为无限制而不是 0。当我们遇到非数字 GDBHISTSIZE 时,我们什么也不做。
2015-06-17 18:30:10 UTC:
下一版本的 GDB 将不再读取 HISTSIZE,因为这样做会导致比解决的问题更多。而是出于相同目的读取 GDBHISTSIZE。为了更好地衡量,GDBHISTSIZE 的行为将匹配 bash 读取 HISTSIZE 的方式,因此将 GDBHISTSIZE 设置为 -1 将导致 GDB 的历史记录大小不受限制。