Così recentemente, stavo discutendo di strace con qualcuno e mi chiedevano cosa sarebbe successo se avessi tracciato un processo in esecuzione proprio mentre stava creando un socket di rete o qualcosa di simile. Ciò potrebbe causare l'arresto anomalo del programma in modi imprevisti?
Da quello che ho letto su ptrace, la syscall usata da strace, non dovrebbe essere in grado di causare nulla del genere se stai solo eseguendo il debug di un thread. Il processo viene interrotto ogni volta che viene chiamata una syscall, ma in seguito dovrebbe riprendere e non essere più saggio. I segnali vengono messi in coda mentre non è in esecuzione, quindi presumo che accada qualcosa di simile con syscalls/sockets/listen.
ptrace utilizzato nel contesto di strace può causare strani arresti anomali del processo?
Risposta accettata:
No , strace
non dovrebbe causare un arresto anomalo del programma –
Tranne in questo caso alquanto insolito:
Se ha un bug che dipende dai tempi di esecuzione o percorsi di memoria di runtime .
Potrebbe innescare questo tipo di "heisenbug ” – ma estremamente raramente, perché questo tipo di bug è raro e deve attivarsi solo con strace o altra strumentazione.
E quando trovi un heisenbug, spesso è una buona cosa.
Riguardo a ptrace()
– la syscall – questo è proprio ciò che strace
fa dentro penso, quindi è simile. Si può fare solo più di strace
can quando si utilizza ptrace()
direttamente.
Il tuo esempio sarebbe proprio questo tipo di bug:
Nell'esempio, strace
cambierebbe la tempistica dei passaggi per creare una connessione di rete. Se ciò causa un problema, si trattava di un "problema in attesa di verificarsi":i tempi di esecuzione cambiano costantemente. Con strace
, solo un po 'di più. Ma qualsiasi altra applicazione avrebbe potuto modificare maggiormente i tempi, come avviare un programma.