aku mengerti itu strace
perintah menggunakan ptrace(PTRACE_PEEKUSER, child, __builtin_offsetof(struct user, regs.orig_eax))
untuk menemukan indeks dari suatu sistem panggilan, anak terlacak terperangkap di. Kemudian untuk menerjemahkan indeks ke nama fungsi syscall, ia telah membangun tabel-tabel yang dibuat dari menerima header kode sumber linux yang ada dalam instalasi.
Metode ini harus tidak terdokumentasi dan rentan terhadap kegagalan karena lokasi dan sintaksis deklarasi kode sumber tidak didokumentasikan, harus ditemukan dengan grepping dan dapat berubah dengan cara yang tidak diketahui. Apakah saya benar mengatakan itu?
Jika begitu, lalu mengapa strace
tidak menggunakan metode berikut, menurut saya, lebih sederhana, hanya bergantung pada dokumentasi dan karenanya sangat mudah.
Pada awal menjalankan pertama setelah reboot, strace
mengirimkan tes syscall, satu untuk setiap fungsi syscall, menjebaknya, dan mengamati indeks syscall apa yang digunakan anak. Itu memberikan tabel kustom yang lengkap dan benar yang dapat disimpan dalam file yang dikenal untuk pemanggilan selanjutnya strace
.
Saya yakin metode ini harus dipertimbangkan, karena tidak ada yang cerdik. Jadi pasti ada yang salah dengan itu. Apa yang salah??
open(foobar.txt, O_RDONLY)
tidak diperlukan hal-hal yang tidak berdokumenstrace
Aku percaya). Jadi saya perlu memastikan apakah saya menyimpan meja, karena saya tidak ingin menghitungnya setiap waktustrace
dipanggil, lalu dihapus saat reboot. Tentunya harus ada cara di Linux untuk mengetahui, apakah saya dipanggil pertama kali setelah reboot. Tentunya harus ada beberapa file yang disentuh / dibuat saat reboot, sehingga saya dapat membandingkan stempel waktu saya dengan itu?open(foobar.txt, O_RDONLY)
menghasilkan persis satu syscall dan ituSYS_open
? Mungkin digunakanSYS_openat
. Mungkin mengakibatkan panggilan sistem lain terjadi sebagai bagian dari ikatan malas pada penghubung dinamis, jika ini adalah panggilan pertamaopen
. Atau mungkin melibatkan panggilan sistem lain secara internal untuk tujuan lain. Tidak ada pemetaan satu-ke-satu yang dapat Anda asumsikan antara panggilan perpustakaan dan panggilan sistem.Jawaban:
Karena tidak ada konsep nama panggilan pada tingkat rendah. Tidak ada jalan
strace
bisa mengatakan "Hei, ayo buat afcntl()
panggil dan lihat nomornya! ". Hanya dapat melakukan panggilan berdasarkan nomor syscall itu sendiri. Ini karena syscall dibuat ketika nomor syscall disimpan keeax
ataurax
mendaftar, dan proses panggilanint 0x80
atausyscall
.sumber