Стрелка вверх в GDB не работает

Стрелка вверх в GDB не работает

Я много искал о подобных проблемах, но ничего не нашел. При запуске gdb я не мог использовать стрелку вверх для перехода по предыдущим командам. Стрелки вверх и вниз просто игнорируются. Я начал наблюдать это поведение после изменения некоторых настроек, но я не помню, какие именно настройки были изменены.

У меня нет ~/.xinputrcфайла, и $TERMустановлено значение xterm.

решение1

Это может быть связано с тем, что размер вашей истории равен 0.

Вы можете проверить размер истории GDB:

(gdb) show history size
The size of the command history is 0.
(gdb) 

Еслимаксимальный размер истории 0, затемстрелка вверхконечно, не работает, потому что никакая история не может быть сохранена.

Основная причина, которую я нашел, заключается в том, что переменная окружения bash HISTSIZE равна 0 или пуста. Это расстраивает, потому что я думал,HISTSIZE=(пустое значениесправа) в ~/.bashrc можно сделать так, чтобы история bash сохраняласьнеограниченное количество записей, нопобочный эффект - gdb ссылается на $HISTSIZE и затем устанавливает размер истории gdb равным 0при запуске gdb.

Так что вы можете поставитьРАЗМЕР_ИСТОРИИ=10000000в вашем ~/.bashrc и стрелка вверх теперь должна работать (ПРЕДУПРЕЖДАТЬ: сделайте резервную копию ~/.bash_historyпрежде чем экспериментировать с HISTSIZE):

(gdb) show history size 
The size of the command history is 10000000.
(gdb) 

Если вы настаиваете на сохраненииHISTSIZE=пусто в ~/.bashrc, то есть вариант создать эту функцию в ~/.bashrc:

gdb() ( HISTSIZE=70000000; /usr/bin/gdb "$@"; )

. ~/.bashrcдля перезагрузки, теперь он изменился:

(gdb) show history size 
The size of the command history is 70000000.
(gdb) 

После выхода из gdb исходный $HISTSIZE не будет переопределен (т.е. останется пустым и неограниченным), поскольку наша функция gdb использует подоболочку, т.е. заключена в скобки, gdb() (...):

$ echo $HISTSIZE

$ 

Вам также придется включить историю при выходе, а затем подумать, где сохранить файл истории. Ниже приведен мой файл ~/.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

$ 

Вы можете спросить, почемуустановить среду HISTSIZE 10000000не работает? Это потому, что это влияет только на программу, а не на сам GDB, как указано на страницеhttp://www.delorie.com/gnu/docs/gdb/gdb_20.html:

Установите переменную окружения varname в значение. Значение изменяется только для вашей программы, а не для самого 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 неограниченным.

Связанный контент