GDB 向上箭头不起作用

eXX*_*XX2 3 linux gdb

我搜索了很多类似的问题,但一无所获。运行 gdb 时,我无法使用向上箭头遍历以前的命令。向上和向下箭头被忽略。在更改某些设置后,我开始观察这种行为,但我不记得具体更改了哪些设置。

我没有~/.xinputrc文件,$TERM设置为xterm.

Fru*_*uit 7

这可能是因为您的历史记录大小为 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 的历史记录大小不受限制。