Mi dispiace che non posso postare il codice per riprodurre questo. Il mio problema è precisamente che non so come risolvere il problema.di tanto in tanto manca PTRACE_EVENT_VFORK durante l'esecuzione ptrace
Sto usando ptrace con PTRACE_O_TRACEFORK | PTRACE_O_TRACEEXEC | PTRACE_O_TRACEVFORK | PTRACE_O_TRACEVFORKDONE | PTRACE_O_TRACECLONE
per rintracciare un processo e sono i bambini (ei figli dei bambini). Il meccanismo è molto simile a strace
, ma con scopi leggermente diversi, poiché sto semplicemente monitorando i file che vengono letti o modificati.
Il mio codice (scritto in C) funziona bene su Debian wheezy e Debian jessie sull'architettura x86-64 (e anche meno testato su i386). Quando provo a compilare ed eseguire su una macchina virtuale Ubuntu Precision x86-64 (che usa un kernel 3.2.0), ho dei problemi.
Sulla macchina precisa, mi volte scoprire che non ricevo un PTRACE_EVENT_VFORK
subito dopo una chiamata vfork
accade, ma invece iniziare a ricevere gli eventi (un paio di SIGSTOP
eventi, e un paio di chiamate di sistema) senza mai ottenere il PTRACE_EVENT_VFORK
evento. Non vedo nulla di sospetto nelle chiamate di sistema eseguite e il comportamento non è prevedibile.
Non sono sicuro di cosa provare a ridurlo a un errore minimo, e non ho davvero idea di cosa potrebbe andare storto, non avendo mai visto prima questo comportamento degli eventi mancanti. È concepibile che la differenza non sia il kernel, ma piuttosto gli strumenti di compilazione che sto tracciando (che è una combinazione di python + gcc).
Qualche suggerimento?
Se nessuno qui può aiutarti, prova a chiedere sulla mailing list linux-kernel. (Difficile da aiutare, ma vale la pena provare.) In alternativa a 'ptrace', potresti usare il [trucco LD_PRELOAD] (http://stackoverflow.com/q/426230/) per intercettare le chiamate a' open', ' leggi', 'scrivi' e' chiudi'. E buona fortuna; questo sembra brutto. – Nemo
Ho evitato LD_PRELOAD, dal momento che voglio che il mio codice sia in grado di tracciare i binari collegati staticamente. E francamente, ho paura del linux-kernel! lol :) –
Accetto LD_PRELOAD non è un modo corretto/valido per farlo. Sfortunatamente non conosco la causa dei guasti alla traccia vfork. Se è possibile utilizzare la modalità di tracciamento seccomp anziché quella legacy ptrace, potrebbe essere meno soggetta a errori e più portabile. –