[20260927]rlwrap与gdb配合使用问题.txt
--//我个人比较偷懒,打过的命令总想不再按复杂的按键再次调唤出来。
--//但是gdb现在的版本内部集成了readline库,但是两种总是配合不好,打过的命令退出后就没有记忆了,无法再调出。
--//以前在centos 7.4就遇到类似问题,参考链接 : 20240922]gdb与rlwrap使用问题.txt
--//当时的感觉就是还不如没有以前的情况好用,指gdb不包括readline库。
--//gdb 内部自身存在命令补全的功能,加入rlwrap后失去作用,要另外自己建立字典。
--//使用centos 9还是也遇到类似问题。
--//kimi的解答:
虽然基本兼容,但在某些特定场景下可能会遇到问题:
自动补全的"接管"问题:gdb 本身有自己的自动补全系统。当你在 gdb 内部使用 Python 的 ipython 等子环境后,rlwrap 的补全功能
可能会"接管"原本 gdb 的符号补全,导致从 ipython 退出后,gdb 的符号补全失效。
终端控制序列干扰:某些情况下,gdb 或 rlwrap 输出的终端控制序列可能会相互干扰,导致界面显示异常。可以尝试为 gdb 添加 -t
dumb 选项来简化终端控制。
--always-readline 选项:如果你的 gdb 使用过程中需要调用分页器或编辑器,可以尝试使用 rlwrap -a gdb(-a 即
--always-readline)来保持 readline 模式。但请注意,这可能会使密码提示等敏感信息被回显和记录 。
总的来说,rlwrap gdb 的组合在 CentOS 上是可行的,能显著改善 gdb 的命令行交互体验,但在处理复杂补全或终端交互时可能需要一
些额外的调整。
$ ldd $(which gdb) | egrep -i "read|ncurse"
libreadline.so.8 => /lib64/libreadline.so.8 (0x00007fc6377a8000)
libncursesw.so.6 => /lib64/libncursesw.so.6 (0x00007fc637697000)
--//centos 7链接的是 libncurses.so.5 => /lib64/libncurses.so.5 (0x00007f0a3e318000)
--//有w 没有w 不知道区别在那里。
--//建立别名如下,在~/.bash_profile文件加入如下:
$ grep gdb ~/.bash_profile
alias rlgdb="rlwrap --always-readline -N -r -f /usr/local/share/rlwrap/rlgdb.txt gdb"
--//这样能解决遇到的问题,历史记录文件~/.gdb_history也能记录打过的命令.
--// /usr/local/share/rlwrap/rlgdb.txt 的建立按照如下步骤:
--//在gdb下执行:
set logging file /tmp/rlgdb.log
set logging overwrite on
set logging enabled on
help all
quit
--//然后使用vim编辑/tmp/rlgdb.log文件。
--//执行如下:
:%s/ -- .*$// --//删除 -- 到结尾.
:%s/, /^M/g --//, 替换为回车.
--//保存退出
$ cat /tmp/rlgdb.log | tr ' ' '\n' | sort | uniq >| rlgdb.txt
--//然后适当编辑rlgdb.txt就可以,删除单个字符的命令。
--//然后执行:
# cp rlgdb.txt /usr/local/share/rlwrap/rlgdb.txt
# chown root:root /usr/local/share/rlwrap/rlgdb.txt
--//常用命令也可以调出,自己打过的命令记录在~/.gdb_history,方便下次执行时调出,ctrl+r也可以调出以前打过的命令.
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-3184446/ ,如需转载,请注明出处,否则将追究法律责任。