GNU/Linux >> LINUX-Kenntnisse >  >> Linux

warum mag gdb keine aliase

Aliase sind ein Merkmal der Shell. Das Definieren eines Alias ​​erstellt einen neuen Shell-Befehlsnamen. Es wird nur von der Shell erkannt und nur, wenn es als Befehlsname erscheint.

Wenn Sie beispielsweise

eingeben
> ff

an einem Shell-Prompt wird Ihr Alias ​​aufgerufen, aber wenn Sie

eingeben
> echo ff

der 03 ist nur ein Argument, kein Befehl. (Zumindest in Bash können Sie einige Tricks spielen, wenn die Alias-Definition mit einem Leerzeichen endet. Sehen Sie sich die Antwort von Stéphane Chazelas für eine mögliche Lösung an, wenn Sie entschlossen sind, Shell-Aliase zu verwenden.)

Sie haben

eingegeben
> gdb ff

also hat die Shell 18 aufgerufen , indem Sie ihm die Zeichenfolge 23 übergeben als Argument.

Über 35 können Sie Argumente an das debuggte Programm übergeben Befehlszeile, aber Sie müssen den 48 verwenden Möglichkeit. Zum Beispiel:

> gdb firefox --safe-mode

versucht (und scheitert), 54 zu behandeln als Option zu 68 . Um den Befehl mit einem Argument auszuführen, können Sie dies manuell tun:

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

oder, wie mich die Antwort von thrig erinnert, können Sie 75 verwenden :

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

(Das erste Argument nach 86 ist der Befehlsname; alle verbleibenden Argumente werden an den aufgerufenen Befehl übergeben.)

Es ist möglich, die Argumente aus einem Shell-Alias ​​zu extrahieren, aber ich würde empfehlen, einfach einen separaten Alias ​​zu definieren:

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

Oder verwenden Sie besser Shell-Funktionen, die viel vielseitiger sind. Das Bash-Handbuch sagt:

Für fast alle Zwecke werden Shell-Funktionen Aliasen vorgezogen.


Nicht direkt, aber es ist möglich, wenn man ZSH-Shell-Aliase in eine Form bringt, die für 91 geeignet ist .

alias testtest='echo test test test'

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

Dies teilt den Alias ​​auf (robusterer Code würde prüfen, ob das erste Argument tatsächlich ein Alias ​​ist oder sogar gesetzt ist usw.), wie es ZSH tun würde, und speist diese Argumente dann in 108 ein über das praktische 118 Flag (siehe 127 ). Wenn wir dann 130 ausführen

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

was zeigt, dass 140 (meine Assembly-Implementierung von 154 , sowieso) wurde von 168 ausgeführt mit den Argumenten aus dem Alias.

(Dies wird wahrscheinlich bei globalen Aliasen oder allen Aliasen mit dem Shell-Metazeichen foo brechen, je nachdem, ob gdb diese Argumente durch eine Shell wirft, die mit allem kompatibel ist, was in ZSH festgelegt werden könnte, aber für einfachen 173 Typ Zeug. Vielleicht.)


In POSIX-Shells werden Aliase nur an Befehlsposition (dort wo ein Befehl erwartet wird) oder nach Aliasnamen erweitert, deren Erweiterung mit einem Leerzeichen endet (in 184 , nur ein Leerzeichen und in vielen anderen Implementierungen nur ein Leerzeichen oder ein Tabulator)¹. Außerdem benötigen Sie den 193 Option zu 206 um Argumente an das zu debuggende Programm übergeben zu können. Sie können also Folgendes tun:

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 unterstützt auch global Aliasse (mit 216 ), die an vielen weiteren Stellen erweitert werden, aber Sie würden einen solchen Alias ​​wahrscheinlich nicht für Ihren 229 verwenden wollen hier, da Sie 233 nicht wollen würden um beispielsweise etwas anderes als 243 auszugeben .


Linux
  1. So verwenden Sie Shell-Aliase unter Linux

  2. Definieren Sie einen Alias, der auf andere Aliase verweist

  3. Warum funktioniert Bash `(())` nicht innerhalb von `[[]]`?

  4. Warum einen Link wie diesen erstellen:ln -nsf?

  5. Warum eliminiert die Gzip-Komprimierung keine doppelten Datenblöcke?

15 Befehlszeilen-Aliase, um Ihnen Zeit zu sparen

So erstellen Sie Bash-Aliase

So erstellen Sie Domain-Aliase

Linux-Alias-Befehl

Warum Linux Bridge nicht funktioniert

Warum überprüft wget keine SSL-Zertifikate?