gdbがエイリアスが好きではない理由[重複]

gdbがエイリアスが好きではない理由[重複]

エイリアスを作成し、ffからソースをインポートしました~/.zsh/aliases.zsh

エイリアス自体はうまく機能します。

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

期待どおりに動作します。

ただし、以下で実行しようとすると、次のような結果gdbが表示されます。

> 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

試してみましたがgdb firefox --safe-mode実行されません。

誰でも問題が何であるかを理解できますか?

答え1

エイリアスはシェルの機能です。エイリアスを定義すると、新しいシェルコマンド名が生成されます。これはシェルでのみ認識され、コマンド名で表示される場合にのみ認識されます。

たとえば、次のように入力すると

> ff

シェルプロンプトでエイリアスを呼び出しますが、次のように入力すると

> echo ff

これはffコマンドではなくパラメータにすぎません。 (少なくともbashでは、エイリアス定義が空白で終わる場合は、いくつかのトリックを使用できます。Stefan Chazerasの答えシェルエイリアスを使用することにした場合は、考えられる回避策をご覧ください。 )

あなたは入力

> gdb ff

したがって、シェルは文字列を引数として渡してgdb呼び出されます。ff

コマンドラインを介してデバッグしているプログラムに引数を渡すことはできますが、gdbこのオプションを使用する必要があります--args。たとえば、

> gdb firefox --safe-mode

引数を使用してコマンドを実行するには、手動--safe-modegdb実行できます。

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

または、次のようにトリガーの答え以下が利用可能であることを思い出してください--args

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

(次の最初の引数--argsはコマンド名です。残りの引数はすべて呼び出されたコマンドに渡されます。)

シェルエイリアスからパラメータを抽出することは可能ですが、別々のエイリアスを定義することをお勧めします。

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

あるいは、より多様な機能を提供するシェル機能を使用する方がよいでしょう。 Bashのマニュアルは次のように言います:

ほとんどすべての目的で、シェル関数はエイリアスより優れています。

答え2

直接ではありませんが、ZSHシェルエイリアスをgdb

alias testtest='echo test test test'

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

これはZSHのようにエイリアスを分割し(より強力なコードでは、最初の引数が実際にエイリアスであるか設定されているかなどを確認します)、便利なフラグを使用してその引数をgdb提供--argsします(参考文献を参照info gdb invocation)。それから実行すると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) 

これはecho私のアセンブリの実装echo、何が起こっても)gdbエイリアスのパラメータを介して実行されます。

(これは、グローバルエイリアスまたはシェルメタ文字fooを持つエイリアスで壊れる可能性があります。gdbがZSHに設定されているものと互換性のあるシェルを介してこれらの引数をスローするかどうかによって異なりますが、単純なx='y z'タイプの場合は問題ありません。)

答え3

POSIXシェルでは、エイリアスはコマンドの場所(コマンドが必要な場所)でのみ拡張されるか、スペース文字で終わるエイリアス(zsh他の多くの実装ではスペースまたはタブのみ)を展開した後にのみ拡張されます。デバッグしているプログラムにパラメータを渡すオプションも必要です--argsgdbだからあなたはこれを行うことができます:

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もサポートグローバルエイリアス(含む)はより多くの場所に拡張されますが。以外の項目を出力したくないので、ここではそのようなエイリアスを使いたくalias -gないでしょう。firefox --safe-modeecho ffff

答え4

許可されたパラメータを取得するためにエイリアスは必要ありませんgdb

あなたの場合は次のとおりです。

gdb firefox
(gdb) set args --safe-mode

関連情報