bash / gdb 在 RedHat 上自动补全核心文件,但在 Ubuntu 上则不然

bash / gdb 在 RedHat 上自动补全核心文件,但在 Ubuntu 上则不然

当程序转储核心时,我们设置kernel.core_pattern将核心文件放置在具有特定文件名等的特定位置。

kernel.core_pattern = | /var/core_file_handler.py %e %s %p %lu %g %t

这是目标目录和示例核心文件:

$ ls -l /var/cores
drwxr-xr-x 2 root root 4.0K Mar 23 09:42 app

$ ls -l /var/cores/app/
-rw-r--r-- 1 root root 60510208 Mar 23 09:42 2016.03.23_09.42.14.867727_11_SIGSEGV_u

CentOS 6.7

在 CentOS 6.7 上,我有 bash 4.1.2 和 gdb 7.5

$ bash --version
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)

$ gdb --version
GNU gdb (GDB) Red Hat Enterprise Linux (7.5.0.20120926-26.el6)

当我想打开一个核心文件时,我可以输入 gdb 然后选项卡完成路径和核心文件

gdb ./app /var/cores/app/201.... <tab> 

这将成功完成核心文件名。

乌班图14.04

在 Ubuntu 14.04 上,我有 bash 4.3.11 和 gdb 7.7.1

$ bash --version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)

$ gdb --version
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1

当我想打开一个核心文件时,我可以输入 gdb 然后选项卡完成路径,但是不是核心文件

gdb ./app /var/cores/app/  <tab> <tab> <tab>....

这会不使用制表符补全核心文件名。它只是被卡住/var/cores/app/并且不会再进一步

  • 两台机器上的访问权限/var/cores/app相同
  • 两台机器上的访问权限/var/cores/app/core_file相同

问题:

为什么我可以制表符完整CentOS 上有 core-file-name 但 Ubuntu 上没有?

答案1

这与可编程完成有关。这个想法是,通过排除程序无法处理的事情,可以让用户的生活变得更轻松。

然而,在实践中,我经常发现,通过从完成中排除一些东西,你将不可避免地得到一些虽然完成排除但你确实想要使用的东西。到那时,可编程完成就成为负担而不是帮助。

您可以通过三种方法解决此问题:

  • 卸载可编程完成。这是一项您不需要的可选功能如果你不想使用的话。你可以通过以下方式做到这一点apt-get remove bash-completion
  • 如果您出于某种原因不想(或不能)删除 bash-completion,您可以运行complete -r,这会再次删除所有完成规则。如果您从类似的方式执行此操作.bashrc,效果将与第一个选项相同,只是在 bash 启动时会出现一些性能损失,因为规则会被处理然后再次删除。
  • 如果您只是想偶尔强制 bash 完成文件名,可以使用alt+/而不是tab强制 bash 执行文件名完成。

答案2

出现这种情况是因为 Ubuntu 系统上的自定义自动完成行为与gdb您的核心文件名不匹配。

您可以通过调整 at 的自定义完成函数来修改行为gdb

/usr/share/bash-completion/completions/gdb

例如,我只是将我的核心文件命名得稍微更独特(corexyx...这样我就可以避免备份它们),这破坏了完成。我改变了线路:

COMPREPLY+=( $( compgen -f -X '!?(*/)core?(.+([0-9]))' -o plusdirs \

COMPREPLY+=( $( compgen -f -X '!?(*/)core?(*)' -o plusdirs \

这只是扩大了它接受核心文件的模式(特别是,它不需要后面的字符core(如果有)是..

如果要在 GDB 的“智能”补全未生成任何匹配项时包含默认匹配项,您可以按照注释中的 Mark 建议进行操作,只需将最后一行更改为:

complete -F _gdb gdb

complete -o default -F _gdb gdb

这是该选项的文档-o default

如果在定义 compspec 时提供了 -o 默认选项来完成,则当 compspec(以及默认的 bash 完成)没有生成匹配项时,将执行 readline 的默认完成。

最后,您可以通过完全注释掉该complete -F _gdb gdb行来完全禁用 GDB 的智能完成功能。

相关内容