bagaimana cara "melacak" suatu program seperti shell?

1

aku mengerti itu dash adalah shell "model" - itu ditulis baru-baru ini dan baik dan itu hanya mengimplementasikan apa yang diperlukan dari shell POSIX. Saya melihat kode sumber dasbor untuk memahami bagaimana "melacak" suatu program seperti shell, dilakukan.

"Tracing" dari dasbor dilakukan dengan mengompilasinya dengan DEBUG didefinisikan dan dipanggil dengan -o debug. Ketika Anda melakukannya, sebuah file trace dibuka dengan fopen informasi yang dibuang tentang apa dash lakukan saat dijalankan.

Kecuali seluruh mekanisme, menurut saya, tidak bekerja, bahkan dalam cangkang "ditulis dengan sempurna" ini. Jika saya memiliki ini dalam skrip shell:

exec 3>&1

segera semua informasi setelah itu, sangat mungkin tidak lagi dibuang ke file trace tapi berakhir stdout. Itu karena fopen panggilan open dan itu kemungkinan mengembalikan file descriptor 3.

Ini bukan contoh yang dibuat-buat. Ada skrip yang biasa digunakan di dunia nyata yang memiliki garis seperti

exec jumlah >&1

(Saya melihat itu di 2 autotool configure skrip: untuk perangkat lunak IP Infusion dan Kerberos).

Jadi bagaimana sebuah shell dapat di-debug / dilacak, ketika harus menjalankan skrip seperti ini?

(Saya tidak mencari alat di luar shell - Saya ingin tahu apa cara yang benar untuk melacak, di dalam program seperti shell. Atau apakah itu tidak mungkin secara umum?)

user322908
sumber
"strace -f" mungkin atau mungkin tidak membantu
barrycarter
@barrycarter ya, terima kasih, poin bagus, tapi ... Saya ingin melakukannya di dalam shell - mengklarifikasi pertanyaan. Pada dasarnya, saya ingin tahu, jika Tuhan menulis sebuah shell, bagaimana mereka menerapkan penelusuran. Atau apakah itu tidak mungkin secara umum karena masalah di atas.
user322908

Jawaban:

1

Anda bisa menggunakan soket ( syslogd melakukan ini misalnya). Tapi kemudian bagaimana Anda melindungi terhadap perintah suka

LD_PRELOAD=my_bogus_socket_funcs.so somecommand

Atau Anda bisa menggunakannya dup2 untuk mengubah deskriptor file ke nomor yang lebih tinggi. Tapi itu bukan jaminan, mungkin hanya perlindungan terhadap kesalahan skrip (seperti menggunakan 3 alih-alih 2 dalam pengalihan).

Jika skrip ingin mengubah perilaku penelusuran dengan sengaja, saya yakin tidak banyak yang bisa dilakukan shell.

Krumelur
sumber
bukan karena "skrip ingin mengubah penelusuran dengan sengaja", skrip ini tidak. Saya tidak mencari untuk menjalankan skrip jahat, hanya yang ditulis dengan buruk. Script menggunakan 3 untuk tujuan lain, memiliki hardcoded, dan tidak tahu, bahwa seseorang mungkin sudah memiliki yang terbuka.
user322908
ya saya pikir dup2 untuk "deskriptor file angka ajaib" mungkin yang terbaik bertaruh ...
user322908
1
Dalam kasus tertentu pendekatan mana pun akan berhasil. Maksud saya adalah bahwa kecuali Anda tahu kesalahan yang ada dalam naskah, benar-benar tidak ada cara untuk menjamin bahwa mereka akan berjalan. Skrip mungkin memiliki alasan yang sah untuk melakukan hal-hal seperti mengganti fungsi socket (saya telah menggunakannya sendiri).
Krumelur