Setara dengan “truss -T” dan “truss -U” di Linux?

12

Apakah ada yang setara dengan apa -Tdan -Uopsi trussutilitas Solaris tidak di Linux.

Itu adalah untuk menentukan panggilan sistem ( -T) atau fungsi perpustakaan ( -U) yang ketika dipanggil oleh aplikasi yang dilacak akan menyebabkannya berhenti.

Atau, dikatakan sebaliknya, saya ingin proses apa pun yang dimulai oleh aplikasi yang dilacak dihentikan (seolah-olah dibunuh oleh SIGSTOP) segera setelah itu membuat panggilan sistem yang diberikan atau panggilan fungsi perpustakaan bersama yang diberikan.

stracedan ltracedi Linux menyediakan banyak fitur dari Solaris truss, tetapi mereka tampaknya tidak melakukan itu.

Contohnya:

truss -f -T open cmd

Akan seperti strace -f cmdkecuali bahwa jika proses mengeksekusi cmdatau keturunannya melakukan openpanggilan sistem apa pun , itu akan segera dihentikan (dan saya dapat melanjutkannya nanti sesuai keinginan saya)

Dalam beberapa kasus, saya bisa menggunakan gdbitu catch syscall, tetapi saya sedang mencari solusi yang dapat dengan mudah mengikuti garpu dan terus melakukannya untuk semua proses bercabang dan terus melakukannya bahkan setelah execveitu.

Saya sepertinya mengingat beberapa utilitas yang memberikan fungsionalitas yang sama, bahkan satu (atau opsi untuk utilitas yang sama) untuk aplikasi satu langkah di antara beberapa kejadian beberapa syscall jarak jauh seperti itu, tetapi memori saya gagal, saya bahkan tidak bisa memastikan itu di Linux.

Stéphane Chazelas
sumber
1
Tidak benar-benar jawaban untuk pertanyaan Anda tetapi gdb memang memiliki beberapa opsi untuk mengikuti garpu, itu hanya tidak mengunci eksekusi. Ini masih hanya melakukan satu proses pada satu waktu, meskipun, yang mungkin merupakan pemecah kesepakatan jika Anda mencari fungsionalitas seperti strace, tapi saya pikir saya akan menyebutkannya untuk berjaga-jaga.
Bratchley
@ JoelDavis, terima kasih. Dan sepertinya juga bisa mengikuti setelah exec, ( follow-exec-mode), saya bereksperimen dengan itu. Tidak sepenuhnya menjawab pertanyaan, tetapi mungkin cukup baik untuk apa yang saya butuhkan.
Stéphane Chazelas
Jika saya memahami pertanyaan Anda, Anda sedang mencari cara untuk melacak sampai sinyal tertentu terlihat dan kemudian berhenti melacak, tidak menghentikan atau mematikan aplikasi yang Anda telusuri dengan cara apa pun, bukan?
slm
@slm, tidak, saya ingin proses dimulai dengan aplikasi yang dilacak dihentikan (seolah-olah dibunuh oleh SIGSTOP) segera setelah ia membuat panggilan sistem yang diberikan. Saya telah menambahkan tautan ke halaman trussmanual Solaris .
Stéphane Chazelas
Biarkan saya memastikan saya mengerti dengan benar. Anda ingin cara untuk menghentikan suatu proses ketika itu membuat panggilan sistem tertentu. Apakah itu benar?
sparticvs

Jawaban:

3

Sejauh pengetahuan saya ini tidak dapat dilakukan dengan strace, ptracefungsi yang digunakan secara internal tidak SIGSTOPatau SIGINTpada panggilan.

EDIT:

Saya memasukkan solusi sederhana ini ke dalam ministrace , jadi tidak diperlukan pengkodean.

Solusi yang saya usulkan, jika tidak semua fungsi dari strace diperlukan, akan memodifikasi ministrace - yang saya temukan di sini Tulis sendiri strace dalam 70 baris kode .

Dalam program satu tembakan Anda dapat menambahkan dua baris sebelum kode berikut:

if (wait_for_syscall(child) != 0) break;

Kode palsu:

if(syscall == SYS_write)
    do {
        char str[4];
        gets(str);  // waits until enter to continue    
    } while(0);

Saya belum menguji semua ini, langkah-langkah terakhir ini diserahkan kepada Anda.

Daniël W. Crompton
sumber
Terima kasih. Ini berfungsi dan tautan itu sangat berguna. Namun (dapat dimengerti dalam beberapa baris kode), itu tidak melakukan decoding arg yang dilakukan gdb / strace, jadi tidak akan berguna untuk tujuan saya. Itu menunjukkan bahwa itu mudah dilakukan. Aku pergi untuk gdb pada akhirnya tetapi sepertinya patching strace untuk fitur itu akan relatif mudah Membiarkan pertanyaan terbuka karena saya curiga ada perintah yang ada untuk melakukan itu. Saya akan melihat python-ptrace ketika saya punya waktu.
Stéphane Chazelas
Sama-sama! Saya menjadi sedikit liar dalam memperluas implementasi, jadi akan mungkin untuk merujuk syscall dengan id dan nama. Itu menyenangkan bermain dengan ptrace lagi.
Daniël W. Crompton