bash / gdb autocomplete o arquivo principal no RedHat, mas não no Ubuntu

5

Quando um programa despeja o núcleo, definimos nosso kernel.core_pattern para colocar o arquivo principal em um determinado local com um determinado nome de arquivo, etc.

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

Aqui está o diretório de destino e um arquivo principal de amostra:

$ 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

No CentOS 6.7 eu tenho bash 4.1.2 e 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)

Quando eu quiser abrir um arquivo principal, eu posso digitar gdb e então aba completa o caminho e o arquivo principal

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

Esta guia irá completar com sucesso o nome do arquivo principal.

Ubuntu 14.04

No Ubuntu 14.04 eu tenho o bash 4.3.11 e o 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

Quando eu quiser abrir um arquivo principal, eu posso digitar gdb e, em seguida, aba concluir o caminho, mas não o arquivo principal

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

Esta guia não será concluída o nome do arquivo principal . Ele só fica preso em /var/cores/app/ e não vai mais longe

  • As permissões de acesso em /var/cores/app são as mesmas em ambas as máquinas
  • As permissões de acesso em /var/cores/app/core_file são as mesmas em ambas as máquinas

Pergunta:

Por que eu posso tab-completar o core-file-name no CentOS, mas não no Ubuntu?

    
por Steve Lorimer 01.04.2016 / 17:22

2 respostas

3

Isso tem a ver com a conclusão programável. A ideia é que, excluindo as coisas com as quais um programa não pode lidar, você estará tornando a vida mais fácil para os usuários.

Na prática, no entanto, muitas vezes descubro que, ao excluir as coisas da conclusão, você inevitavelmente terá algo que a conclusão exclui, mas que você realmente quer usar. Nesse ponto, a conclusão programável é um fardo em vez de uma ajuda.

Existem três formas de resolver este problema:

  • desinstale a conclusão programável. É um recurso opcional que você não tem para usar se não quiser. Você pode fazer isso por meio de apt-get remove bash-completion
  • se você não quiser (ou não puder) remover o bash-completion por qualquer motivo, você pode executar complete -r , o que remove todas as regras de conclusão novamente. Se você fizer isso de algo como .bashrc , o efeito será o mesmo da primeira opção, exceto que há uma pequena perda de desempenho na inicialização do bash, já que as regras são processadas e, em seguida, removidas novamente.
  • se você quiser apenas forçar ocasionalmente o bash a preencher um nome de arquivo, poderá usar alt + / em vez de tab para forçar o bash a realizar a conclusão do nome do arquivo.
por 01.04.2016 / 18:21
1

Isso ocorre porque o comportamento de preenchimento automático personalizado para gdb em seu sistema Ubuntu não corresponde ao seu nome de arquivo principal.

Você pode modificar o comportamento ajustando a função de conclusão personalizada para gdb em:

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

Por exemplo, eu simplesmente tenho meus arquivos centrais chamados de forma um pouco mais exclusiva ( corexyx... , para que eu possa evitar o backup deles), o que interrompeu a conclusão. Eu mudei a linha:

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

para

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

que apenas amplia o padrão aceito para arquivos principais (em particular, não é necessário que o caractere a seguir core (se houver) seja um . .

Se incluir as correspondências padrão quando a conclusão "inteligente" do GDB não gerar correspondências, você poderá fazer o que Mark sugeriu nos comentários e simplesmente alterar a última linha de:

complete -F _gdb gdb

para

complete -o default -F _gdb gdb

Veja a documentação da opção -o default :

If the -o default option was supplied to complete when the compspec was defined, readline's default comple‐ tion will be performed if the compspec (and, if attempted, the default bash completions) generate no matches.

Por fim, você pode desativar a conclusão inteligente do GDB apenas comentando totalmente a linha complete -F _gdb gdb .

    
por 05.11.2017 / 00:09

Tags