Donc, récemment, je discutais de strace avec quelqu'un, et ils demandaient ce qui se passerait si vous traçiez un processus en cours d'exécution juste au moment où il créait un socket réseau ou quelque chose de similaire. Cela pourrait-il provoquer un plantage inattendu du programme ?
D'après ce que j'ai lu sur ptrace, l'appel système utilisé par strace, il ne devrait pas pouvoir provoquer quoi que ce soit de ce genre si vous ne faites que déboguer un thread. Le processus est arrêté à chaque fois qu'un appel système est appelé, mais il devrait reprendre plus tard et n'en être pas plus sage. Les signaux sont mis en file d'attente alors qu'il ne fonctionne pas, donc je suppose que quelque chose de similaire se produit avec syscalls/sockets/listen.
ptrace utilisé dans le contexte de strace peut-il provoquer des plantages de processus étranges ?
Réponse acceptée :
Non , strace
ne devrait pas provoquer un plantage du programme –
Sauf dans ce cas un peu inhabituel :
S'il y a un bogue qui dépend du timing d'exécution , ou les emplacements de mémoire d'exécution .
Cela peut déclencher ce genre de "heisenbug ” – mais extrêmement rarement, car ce genre de bug est rare, et il n'a besoin de se déclencher que sous strace ou autre instrumentation.
Et quand vous trouvez un heisenbug, c'est souvent une bonne chose.
Concernant ptrace()
– le syscall – c'est exactement ce que strace
fait à l'intérieur je pense, donc c'est similaire. On peut faire plus que strace
peut lors de l'utilisation de ptrace()
directement.
Votre exemple serait juste ce genre de bogue :
Dans l'exemple, strace
changerait le calendrier des étapes pour créer une connexion réseau. Si cela cause un problème, il s'agissait d'un "problème en attente de se produire" - le moment de l'exécution change constamment. Avec strace
, juste un petit peu plus. Mais toute autre application aurait pu modifier davantage le timing, comme le démarrage d'un programme.