GNU/Linux >> Tutoriels Linux >  >> Linux

pourquoi gdb n'aime pas les alias

Les alias sont une fonctionnalité du shell. La définition d'un alias crée un nouveau nom de commande shell. Il n'est reconnu que par le shell et uniquement lorsqu'il apparaît en tant que nom de commande.

Par exemple, si vous tapez

> ff

à une invite du shell, il invoquera votre alias, mais si vous tapez

> echo ff

le ff est juste un argument, pas une commande. (Au moins dans bash, vous pouvez jouer quelques tours si la définition de l'alias se termine par un espace. Voir la réponse de Stéphane Chazelas pour une solution possible si vous êtes déterminé à utiliser des alias shell.)

Vous avez tapé

> gdb ff

donc le shell a invoqué gdb , en lui passant la chaîne ff comme argument.

Vous pouvez passer des arguments au programme débogué via le gdb ligne de commande, mais vous devez utiliser le --args option. Par exemple :

> gdb firefox --safe-mode

essaie (et échoue) de traiter --safe-mode en option sur gdb . Pour exécuter la commande avec un argument, vous pouvez le faire manuellement :

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

ou, comme me le rappelle la réponse de thrig, vous pouvez utiliser --args :

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

(Le premier argument après --args est le nom de la commande ; tous les arguments restants sont passés à la commande invoquée.)

Il est possible d'extraire les arguments d'un alias de shell, mais je vous recommande de définir simplement un alias séparé :

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

Ou, mieux, utilisez les fonctions du shell, qui sont beaucoup plus polyvalentes. Le manuel bash dit :

Dans presque tous les cas, les fonctions shell sont préférées aux alias.


Pas directement, mais c'est possible avec quelques disputes d'alias de shell ZSH dans une forme adaptée à gdb .

alias testtest='echo test test test'

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

Cela divise l'alias (un code plus robuste vérifierait si le premier argument est bien un alias, ou même est défini, etc.) comme le ferait ZSH, puis transmet ces arguments à gdb via le pratique --args drapeau (voir info gdb invocation ). Si nous exécutons ensuite gdb-alias testtest

% 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) 

qui montre que echo (mon implémentation d'assemblage de echo , de toute façon) a été exécuté par gdb avec les arguments de l'alias.

(Cela se cassera probablement sur les alias globaux, ou tout alias avec le métacaractère shell foo, peut-être, selon que gdb lance ces arguments via un shell compatible avec tout ce qui pourrait être défini dans ZSH, mais devrait convenir pour le simple x='y z' taper des trucs. Peut-être.)


Dans les shells POSIX, les alias ne sont développés qu'en position de commande (là où une commande est attendue) ou après les alias dont le développement se termine par un caractère blanc (en zsh , uniquement un espace et, dans de nombreuses autres implémentations, uniquement un espace ou une tabulation)¹. Vous avez également besoin du --args option à gdb pour pouvoir passer des arguments au programme en cours de débogage. Vous pouvez donc :

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 prend également en charge global alias (avec alias -g ) qui sont développés à de nombreux autres endroits, mais vous ne voudriez probablement pas utiliser un tel alias pour votre firefox --safe-mode ici car vous ne voudriez pas echo ff par exemple pour afficher autre chose que ff .


Linux
  1. 10 alias Bash pratiques pour Linux

  2. Alias ​​de ligne de commande dans le shell Linux

  3. Comment utiliser les alias du shell sous Linux

  4. Définir un alias qui fait référence à d'autres alias

  5. Pourquoi Bash `(())` ne fonctionne-t-il pas dans `[[]]` ?

15 alias de ligne de commande pour vous faire gagner du temps

Comment créer des alias Bash

Comment créer des alias de domaine

Commande d'alias Linux

pourquoi le pont linux ne fonctionne pas

Pourquoi wget ne vérifie pas les certificats SSL ?