Sto scrivendo uno strumento che chiama attraverso DTrace per tracciare il programma specificato dall'utente.Come tracciare un programma sin dall'inizio senza eseguirlo come root
Se il mio strumento utilizza dtrace -c per eseguire il programma come sottoprocesso di DTrace, non solo non posso passare alcun argomento al programma, ma il programma viene eseguito con tutti i privilegi di DTrace, cioè come root (Sono su Mac OS X). Questo rende certe cose che dovrebbero funzionare, e ovviamente rende molte cose che non dovrebbero funzionare.
L'altra soluzione che conosco è quello di avviare il programma stesso, mettere in pausa inviandolo SIGSTOP
, passare il suo PID dtrace -p
, per poi proseguire con l'invio di esso SIGCONT
. Il problema è che il programma viene eseguito per alcuni secondi senza essere tracciato mentre DTrace raccoglie le informazioni sui simboli o, se dormo per alcuni secondi prima di continuare il processo, DTrace lamenta che objc<pid>:<class>:<method>:entry
non corrisponde a nessun probe.
Esiste un modo per eseguire il programma con l'account dell'utente, non come root, ma avere ancora DTrace in grado di tracciarlo dall'inizio?
Ancora meglio: arrotolare tutto in uno. Crea una pipe, fork, aspetta il bambino sulla pipe, dtrace -p CHILD_PID, scrivi nella pipe, il figlio si sveglia e chiama exec. – bstpierre
I suoni promettenti. Non so che funzionerà, però: il mio strumento è scritto in Python ed è progettato per tracciare i programmi Cocoa. Senza alcun Cocoa nel mio strumento, penso che otterrò comunque l'errore che il provider objc non soddisfa. Ma ci proverò domani. –