GNU/Linux >> Belajar Linux >  >> Linux

mengapa gdb tidak menyukai alias

Alias ​​​​adalah fitur dari shell. Mendefinisikan alias membuat nama perintah shell baru. Itu dikenali hanya oleh shell, dan hanya ketika muncul sebagai nama perintah.

Misalnya, jika Anda mengetik

> ff

pada prompt shell, ia akan memanggil alias Anda, tetapi jika Anda mengetik

> echo ff

03 hanyalah argumen, bukan perintah. (Setidaknya di bash, Anda dapat memainkan beberapa trik jika definisi alias diakhiri dengan spasi. Lihat jawaban Stéphane Chazelas untuk kemungkinan solusi jika Anda bertekad untuk menggunakan alias shell.)

Anda mengetik

> gdb ff

jadi shell memanggil 18 , meneruskan string 22 sebagai argumen.

Anda dapat meneruskan argumen ke program debug melalui 35 baris perintah, tetapi Anda harus menggunakan 47 pilihan. Misalnya:

> gdb firefox --safe-mode

mencoba (dan gagal) untuk menangani 54 sebagai opsi untuk 67 . Untuk menjalankan perintah dengan argumen, Anda dapat melakukannya secara manual:

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

atau, seperti yang diingatkan oleh jawaban thrig, Anda dapat menggunakan 75 :

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

(Argumen pertama setelah 85 adalah nama perintah; semua argumen yang tersisa diteruskan ke perintah yang dipanggil.)

Dimungkinkan untuk mengekstrak argumen dari alias shell, tetapi saya sarankan hanya mendefinisikan alias terpisah:

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

Atau, lebih baik, gunakan fungsi shell, yang jauh lebih serbaguna. Manual bash mengatakan:

Untuk hampir setiap tujuan, fungsi shell lebih disukai daripada alias.


Tidak secara langsung tetapi dimungkinkan dengan beberapa perselisihan alias shell ZSH menjadi bentuk yang cocok untuk 90 .

alias testtest='echo test test test'

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

Ini membagi alias (kode yang lebih kuat akan memeriksa apakah argumen pertama memang alias, atau bahkan disetel, dll) seperti yang dilakukan ZSH dan kemudian memasukkan argumen tersebut ke 108 melalui 118 yang praktis bendera (lihat 126 ). Jika kita kemudian menjalankan 130

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

yang menunjukkan bahwa 149 (implementasi rakitan saya dari 154 , anyway) dijalankan oleh 168 dengan argumen dari alias.

(Ini mungkin akan merusak alias global, atau alias apa pun dengan metakarakter shell foo, mungkin, tergantung pada apakah gdb melempar argumen tersebut melalui shell yang kompatibel dengan apa pun yang mungkin disetel di ZSH, tetapi tidak apa-apa untuk 173 ketik barang. Mungkin.)


Dalam shell POSIX, alias hanya diperluas di posisi perintah (di mana pun perintah diharapkan) atau setelah alias yang perluasannya diakhiri dengan karakter kosong (di 184 , hanya spasi, dan di banyak implementasi lainnya, hanya spasi atau tab)¹. Anda juga membutuhkan 193 opsi untuk 205 untuk dapat meneruskan argumen ke program yang sedang di-debug. Jadi, Anda dapat melakukan:

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 juga mendukung global alias (dengan 216 ) yang diperluas di lebih banyak tempat, tetapi Anda mungkin tidak ingin menggunakan alias seperti itu untuk 229 Anda di sini karena Anda tidak ingin 233 misalnya untuk menghasilkan apa pun selain 243 .


Linux
  1. Cara menggunakan alias shell di Linux

  2. Tentukan alias yang mereferensikan alias lain

  3. Mengapa Bash `(())` tidak berfungsi di dalam `[[]]`?

  1. Mengapa membuat tautan seperti ini:ln -nsf?

  2. Mengapa kompresi Gzip tidak menghilangkan potongan duplikat data?

  3. mengapa jembatan linux tidak berfungsi

  1. 10 alias Bash yang berguna untuk Linux

  2. Mengapa Skrip Bash Tidak Mengenal Alias?

  3. Mengapa Sudo Mengabaikan Alias?