web-dev-qa-db-ja.com

なぜ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を使用してみましたが、実行されません。

誰かが何が悪いのかを特定できますか?

10
shirish

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

たとえば、次のように入力した場合

> ff

シェルプロンプトでエイリアスを呼び出しますが、

> echo ff

ffは単なる引数であり、コマンドではありません。 (少なくともbashでは、エイリアスの定義がスペースで終わっている場合、いくつかのトリックを実行できます。シェルエイリアスを使用する場合は、可能な解決策について StéphaneChazelasの回答 を参照してください。)

入力した

> gdb ff

そのため、シェルはgdbを呼び出し、引数として文字列ffを渡しました。

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

> gdb firefox --safe-mode

--safe-modegdbのオプションとして処理しようとします(失敗します)。引数を指定してコマンドを実行するには、手動で実行できます。

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

または、 thrig's answer を思い出させるように、--argsを使用できます:

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

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

Shellエイリアスから引数を抽出することは可能ですが、別のエイリアスを定義することをお勧めします。

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

または、もっと便利なシェル関数を使用します。 bashのマニュアルにはこう書かれています:

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

20
Keith Thompson

直接ではありませんが、ZSHシェルエイリアスをgdbに適した形式に変更することで可能です。

alias testtest='echo test test test'

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

これは、ZSHが行うようにエイリアスを分割し(より堅牢なコードは最初の引数が実際にエイリアスであるか、設定されているかなどをチェックします)、それらの引数を便利な--argsフラグを介してgdbにフィードします(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によって実行されたことを示しています。

(これはおそらく、gdbがZSHで設定されている可能性のあるすべてのものと互換性のあるシェルを介してこれらの引数をスローするかどうかに応じて、グローバルエイリアスまたはシェルメタ文字fooのエイリアスで壊れますが、単純なx='y z'タイプのもの。たぶん。)

5
thrig

POSIXシェルでは、エイリアスはコマンド位置(コマンドが期待される場所)でのみ、または空白文字で終わるエイリアスの後にのみ展開されます(zshではスペースのみ、他の多くの実装ではスペースまたはタブ)¹。デバッグ対象のプログラムに引数を渡すには、gdb--argsオプションも必要です。だからあなたはできる:

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はglobalエイリアス(alias -g付き)もサポートしていますが、これはさらに多くの場所で展開されますが、firefox --safe-modeにこのようなエイリアスを使用したくない場合もあります。たとえば、echo ffff以外のものを出力しないようにする必要があります。

4

gdb受け入れ引数を取得するためにエイリアスは必要ありません。

あなたの場合、それは:

gdb firefox
(gdb) set args --safe-mode
1
Rui F Ribeiro