GNU/Linux >> Linux の 問題 >  >> Linux

なぜgdbはエイリアスを好まないのですか

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

たとえば、

> ff

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

> echo ff

02 コマンドではなく単なる引数です。 (少なくとも bash では、エイリアス定義がスペースで終わる場合、いくつかのトリックを実行できます。シェル エイリアスを使用することに決めた場合は、考えられる解決策について Stéphane Chazelas の回答を参照してください。)

入力しました

> gdb ff

そのため、シェルは 17 を呼び出しました 、文字列 21 を渡します

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

> gdb firefox --safe-mode

53 を処理しようとします (そして失敗します) 66 のオプションとして .引数を指定してコマンドを実行するには、手動で行うことができます:

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

または、スリグの答えが私に思い出させるように、 74 を使用できます :

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

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

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

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

または、はるかに汎用性の高いシェル関数を使用することをお勧めします。 bash のマニュアルには次のように書かれています:

<ブロック引用>

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


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

alias testtest='echo test test test'

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

これにより、エイリアスが分割されます (より堅牢なコードでは、最初の引数が実際にエイリアスであるか、設定されているかなどを確認します)。ZSH はそれらの引数を 107 にフィードします。 便利な 117 経由 フラグ (125 を参照) )。 139 を実行すると

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

148 であることを示しています (153 の私のアセンブリ実装 、とにかく) 167 によって実行されました エイリアスからの引数で。

(これはおそらく、グローバル エイリアス、またはシェル メタ文字 foo を含むエイリアスで壊れる可能性があります。これは、gdb が ZSH で設定されている可能性のあるものと互換性のあるシェルを介してこれらの引数をスローするかどうかによって異なりますが、単純な 172<では問題ありません。 /コード> タイプのもの。たぶん。)


POSIX シェルでは、エイリアスはコマンド位置 (コマンドが期待される場所) または展開が空白文字で終了するエイリアスの後 (183) でのみ展開されます。 、スペースのみ、他の多くの実装ではスペースまたはタブのみ)¹。 192 も必要です 204 へのオプション デバッグ中のプログラムに引数を渡すことができます。できること:

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 はグローバルもサポートします エイリアス (215 を使用) ) より多くの場所に展開されますが、おそらく 228 にそのようなエイリアスを使用したくないでしょう。 ここでは 232 を望まないので たとえば、242 以外のものを出力するには .


Linux
  1. Linux でシェル エイリアスを使用する方法

  2. sed の正規表現で `\d` が機能しないのはなぜですか?

  3. 他のエイリアスを参照するエイリアスを定義する

  1. Bash `(())` が `[[]]` 内で動作しないのはなぜですか?

  2. このようなリンクを作成する理由:ln -nsf?

  3. Gzip 圧縮がデータの重複チャンクを排除しないのはなぜですか?

  1. シンボリック リンクが機能しないのはなぜですか?

  2. Linux ブリッジが機能しない理由

  3. wget が SSL 証明書を検証しないのはなぜですか?