GNU/Linux >> Linux Esercitazione >  >> Linux

perché a gdb non piacciono gli alias

Gli alias sono una caratteristica della shell. La definizione di un alias crea un nuovo nome di comando della shell. Viene riconosciuto solo dalla shell e solo quando appare come nome di comando.

Ad esempio, se digiti

> ff

al prompt della shell, richiamerà il tuo alias, ma se digiti

> echo ff

il ff è solo un argomento, non un comando. (Almeno in bash, puoi giocare qualche trucco se la definizione dell'alias termina con uno spazio. Vedi la risposta di Stéphane Chazelas per una possibile soluzione se sei determinato a usare gli alias della shell.)

Hai digitato

> gdb ff

quindi la shell ha invocato gdb , passandogli la stringa ff come argomento.

Puoi passare argomenti al programma sottoposto a debug tramite gdb riga di comando, ma devi usare il --args opzione. Ad esempio:

> gdb firefox --safe-mode

tenta (e fallisce) di trattare --safe-mode come opzione a gdb . Per eseguire il comando con un argomento, puoi farlo manualmente:

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

oppure, come mi ricorda la risposta di thrig, puoi usare --args :

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

(Il primo argomento che segue --args è il nome del comando; tutti gli argomenti rimanenti vengono passati al comando richiamato.)

È possibile estrarre gli argomenti da un alias della shell, ma ti consiglio di definire semplicemente un alias separato:

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

O, meglio, usa le funzioni della shell, che sono molto più versatili. Il manuale di bash dice:

Per quasi tutti gli scopi, le funzioni di shell sono preferite agli alias.


Non direttamente, ma è possibile con alcune discussioni sugli alias della shell ZSH in una forma adatta a gdb .

alias testtest='echo test test test'

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

Questo divide l'alias (un codice più robusto controllerà se il primo argomento è effettivamente un alias, o addirittura è impostato, ecc.) come farebbe ZSH e poi invia quegli argomenti a gdb tramite il comodo --args flag (vedi info gdb invocation ). Se poi eseguiamo 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) 

che mostra che echo (la mia implementazione in assembly di echo , comunque) era eseguito da gdb con gli argomenti dell'alias.

(Questo probabilmente si romperà sugli alias globali o su qualsiasi alias con il metacarattere della shell foo, forse, a seconda che gdb lanci quegli argomenti attraverso una shell compatibile con qualsiasi cosa che potrebbe essere impostata in ZSH, ma dovrebbe andare bene per il semplice x='y z' tipo roba. Forse.)


Nelle shell POSIX, gli alias vengono espansi solo nella posizione di comando (ovunque sia previsto un comando) o dopo gli alias la cui espansione termina con un carattere vuoto (in zsh , solo uno spazio e, in molte altre implementazioni, solo spazio o tab)¹. Ti serve anche il --args opzione a gdb per poter passare argomenti al programma sottoposto a debug. Quindi puoi fare:

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 supporta anche global alias (con alias -g ) che sono espansi in molti altri posti, ma probabilmente non vorrai usare un tale alias per il tuo firefox --safe-mode qui perché non vorresti echo ff ad esempio per generare qualcosa di diverso da ff .


Linux
  1. Alias ​​della riga di comando nella shell di Linux

  2. Come creare alias di sequenze di tasti della riga di comando in Linux

  3. Perché lo script Bash non riconosce gli alias?

  4. Perché "\d" non funziona nelle espressioni regolari in sed?

  5. perché il bridge linux non funziona

10 utili alias Bash per Linux

15 alias della riga di comando per farti risparmiare tempo

Come creare alias Bash

Come creare alias di dominio

Comando alias Linux

Perché wget non verifica i certificati SSL?