por que o gdb não gosta de aliases [duplicados]

10
    

Esta pergunta já tem uma resposta aqui:

    

Eu criei um alias ff e obtive-o em ~/.zsh/aliases.zsh .

Os aliases são bem executados:

alias ff
ff='firefox --safe-mode'

e funciona como esperado.

Mas quando tento executá-lo em gdb , obtenho:

> gdb ff
GNU gdb (Debian 7.12-6+b1) 7.12.0.20161007-git
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
...
For help, type "help".
Type "apropos word" to search for commands related to "word"...
ff: No such file or directory.
(gdb) quit

Eu tentei usar gdb firefox --safe-mode , mas isso não funcionaria.

Alguém pode identificar o que está errado?

    
por shirish 08.02.2018 / 01:05

4 respostas

20

Aliases são um recurso do shell. Definir um alias cria um novo nome de comando do shell. É reconhecido apenas pelo shell e somente quando aparece como um nome de comando.

Por exemplo, se você digitar

> ff

em um prompt de shell, ele invocará seu alias, mas se você digitar

> echo ff

o ff é apenas um argumento, não um comando. (Pelo menos no bash, você pode jogar alguns truques se a definição do alias terminar com um espaço. Veja a resposta de Stéphane Chazelas para uma possível solução se você estiver determinado a usar aliases de shell.)

Você digitou

> gdb ff

para que o shell invoque gdb , passando a string ff como argumento.

Você pode passar argumentos para o programa depurado através da linha de comando gdb , mas você tem que usar a opção --args . Por exemplo:

> gdb firefox --safe-mode

tenta (e falha) tratar --safe-mode como uma opção para gdb . Para executar o comando com um argumento, você pode fazer isso manualmente:

> gdb firefox
...
(gdb) run --safe-mode

ou, como a resposta do thrig me lembra, você pode usar --args :

> gdb --args firefox --safe-mode
...
(gdb) run

(O primeiro argumento após --args é o nome do comando; todos os argumentos restantes são passados para o comando chamado.)

É possível extrair os argumentos de um alias do shell, mas eu recomendo apenas definir um alias separado:

alias ff='firefox --safe-mode'
alias gdbff='gdb --args firefox --safe-mode'

Ou melhor, use as funções do shell, que são muito mais versáteis. O manual do bash diz:

For almost every purpose, shell functions are preferred over aliases.

    
por 08.02.2018 / 01:11
5

Não diretamente, mas é possível com algumas disputas de aliases de shell ZSH em uma forma adequada para gdb .

alias testtest='echo test test test'

function gdb-alias() {
   local cmdargs
   cmdargs=( ${(z)${aliases[$1]}} )
   gdb -q --args $cmdargs
}

Isso divide o alias (código mais robusto verificaria se o primeiro argumento é de fato um alias, ou até mesmo é definido, etc) como o ZSH faria e então alimentaria esses argumentos para gdb via o prático --args flag %código%). Se, então, executarmos info gdb invocation

% gdb-alias testtest
Reading symbols from echo...(no debugging symbols found)...done.
(gdb) r
Starting program: /Users/jhqdoe/usr/Darwin15.6.0-x86_64/bin/echo test test test
test test test
[Inferior 1 (process 93721) exited normally]
(gdb) 

que mostra que gdb-alias testtest ( minha implementação de assembly de echo , de qualquer maneira) foi executado por echo com os argumentos do alias.

(Isto provavelmente irá quebrar em aliases globais, ou quaisquer aliases com metacaracteres de shell foo, talvez, dependendo se o gdb lançar esses argumentos através de um shell compatível com qualquer coisa que possa ser definido no ZSH, mas deve ser ok para gdb digite coisas. Talvez.)

    
por 08.02.2018 / 03:43
4

Em shells POSIX, os aliases são expandidos apenas na posição de comando (onde um comando é esperado) ou após aliases cuja expansão termina em um caractere vazio (em zsh , apenas um espaço e em muitas outras implementações, apenas espaço ou guia) ¹. Você também precisa da opção --args para gdb para poder passar argumentos para o programa que está sendo depurado. Então você pode fazer:

alias gdba='gdb --args ' # note the trailing space which does mean
                         # that aliases are to be expanded after it
alias ff='firefox --safe-mode'
gdba ff

¹ zsh também suporta aliases globais (com alias -g ) que são expandidos em muitos outros lugares, mas você provavelmente não desejaria usar esse alias para o seu firefox --safe-mode aqui como você não desejaria que echo ff , por exemplo, emitisse algo diferente de ff .

    
por 08.02.2018 / 12:38
1

Você não precisa de aliases para tentar obter gdb aceitando argumentos.

No seu caso, seria:

gdb firefox
(gdb) set args --safe-mode
    
por 08.02.2018 / 12:31