Как я могу заставить GDB сохранять историю команд?

195

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

Фрэнк
источник
1
Примечание. .gdbinitФайл должен быть защищен от записи другими пользователями Linux.
urzeit
@urzeit - я думаю, что это потеряно для дистрибутивов, таких как Ubuntu. По умолчанию они разрешают кому-либо входить в чей-либо домашний каталог.
jww
@jww .gdbinitФайл не обрабатывается, если разрешения не настроены правильно, независимо от того, какие настройки используются по умолчанию или какие другие ограничения для домашних каталогов используются системой.
urzeit
@urzeit Если вы создаете .gdbinitфайл, а это не так, это означает, что вы umaskне настроены на нормальное значение, например 022. Тогда в многопользовательской системе у вас есть большие проблемы, чем просто ваш .gdbinitфайл.
Каз

Ответы:

283

Короткий ответ: echo 'set history save on' >> ~/.gdbinit && chmod 600 ~/.gdbinit


Длинный ответ:

История команд описана в руководстве GDB, 22.3 История команд . Создайте файл $HOME/.gdbinit, измените его разрешения 0600и добавьте следующее содержимое:

set history save on

Вы можете установить количество сохраненных прошлых команд следующим образом. Команда описывается как «Установить количество команд, которые GDB хранит в своем списке истории. По умолчанию это значение переменной среды GDBHISTSIZE или 256, если эта переменная не задана. Нечисловые значения GDBHISTSIZE игнорируются. Если size не ограничен или если GDBHISTSIZE является либо отрицательным числом, либо пустой строкой, то количество команд, которые gdb хранит в списке истории, не ограничено " .

set history size <size>

Связанная команда set history remove-duplicates <count>. Команда описана как «Управлять удалением повторяющихся записей истории в списке истории команд. Если число не равно нулю, GDB проверит последние записи истории счетчиков и удалит первую запись, которая является дубликатом текущей записи. добавлен в список истории команд. Если число не ограничено, то этот просмотр не ограничен. Если число равно 0, удаление дублирующихся записей истории отключено " .

set history remove-duplicates <count>

По умолчанию GDB сохраняет историю в файл ./.gdb_history в текущем каталоге . Если вы хотите, чтобы история команд не зависела от каталога, в котором вы находитесь, также включите:

set history filename ~/.gdb_history
jww
источник
4
Просто выяснил это для себя и решил поделиться этим на SO.
Франк
3
В следующий раз совершенно законно создавать такие вопросы с самостоятельным ответом, как не вики-сообщество. :)
Грег Хьюгилл
@Frank Как насчет того, что если я наберу, nто у меня стрелка вверх, я получу все предыдущие команды, которые начинаются с n.
SIFE
На GDB 8.0.1 это работает без специальных прав доступа к файлам.
Ryan1729
7

Если у вас все еще возникают проблемы, убедитесь, что ваша переменная окружения HISTSIZE имеет достаточно большое число. Моя была пуста, в результате чего значение "размер истории" в GDB по умолчанию было равно 0.

добавленной

export HISTSIZE=100000000

на мой ~ / .bashrc и все хорошо

Вы можете проверить настройки истории GDB, выполнив (внутри GDB) «Показать историю»:

gdb$ show history
expansion:  History expansion on command input is off.
filename:  The filename in which to record the command history is "/home/xiao/.gdb_history".
save:  Saving of the history record on exit is on.
size:  The size of the command history is 100000000.

Из документов :

установить размер истории
установить неограниченный размер истории
Установить количество команд, которые GDB хранит в своем списке истории. По умолчанию используется значение переменной среды HISTSIZE или 256, если эта переменная не установлена. Если размер не ограничен, количество команд, которые GDB хранит в списке истории, не ограничено.

Xiao
источник
У меня такая же проблема. Несмотря set history size 100на добавление в файл .gdbinit, переменная среды HISTSIZE все еще приводила к тому, что размер истории устанавливался в ноль. Проблема в том, что GDB не понимает, что HISTSIZE можно установить неограниченным
DavidW
Ошибка HISTSIZE в gdb была исправлена ​​по состоянию на июнь 2015 года , но это изменение, скорее всего, не будет присутствовать в вашей системе. Между тем, если HISTSIZEустановлено, оно должно быть> 0, иначе GDB отключит историю.
Нейт Р.