Vor kurzem habe ich mit jemandem über strace gesprochen, und er hat gefragt, was passieren würde, wenn Sie einen laufenden Prozess so belasten würden, wie er einen Netzwerk-Socket oder ähnliches erstellt. Könnte dies dazu führen, dass das Programm auf unerwartete Weise abstürzt?
Nach dem, was ich über ptrace gelesen habe, den von strace verwendeten Systemaufruf, sollte es nicht in der Lage sein, so etwas zu verursachen, wenn Sie nur einen Thread debuggen. Der Prozess wird jedes Mal gestoppt, wenn ein Systemaufruf aufgerufen wird. Er sollte jedoch später fortgesetzt werden und nicht klüger sein. Signale werden in die Warteschlange gestellt, während sie nicht ausgeführt werden. Daher gehe ich davon aus, dass bei syscalls / sockets / listen etwas Ähnliches passiert.
Kann ptrace, das im Zusammenhang mit strace verwendet wird, seltsame Prozessabstürze verursachen?
Antworten:
Nein ,
strace
sollte keinen Programmabsturz verursachen -Außer in diesem etwas ungewöhnlichen Fall:
Wenn es einen Fehler gibt, der vom Zeitpunkt der Ausführung oder den Speicherorten der Laufzeit abhängt .
Es kann diese Art von " Heisenbug " auslösen - aber äußerst selten, da diese Art von Fehler selten ist und nur unter Strace oder anderen Instrumenten ausgelöst werden muss. Und wenn Sie einen Heisenbug finden, ist das oft eine gute Sache.
In Bezug auf
ptrace()
- den Systemaufruf - ist das genau das, wasstrace
ich denke, also ist es ähnlich. Man kann einfach mehr alsstrace
beiptrace()
direkter Verwendung .Ihr Beispiel wäre genau diese Art von Fehler:
In diesem Beispiel
strace
würde sich das Timing der Schritte zum Erstellen einer Netzwerkverbindung ändern. Wenn dies ein Problem verursacht, war es ein "Problem, das darauf wartet, passiert zu werden" - der Zeitpunkt der Ausführung ändert sich ständig. Mitstrace
nur ein bisschen mehr. Aber jede andere Anwendung hätte das Timing mehr verändern können, wie das Starten eines Programms.quelle
strace
Instrumentierung vollständig außerhalb des verfolgten Prozesses erfolgt, kann dies falsch sein. ('ltrace' sollte dabei sein und die Adressen der Bibliotheksaufrufe ändern)strace
verwendet nur Abhörfunktionen vonptrace
.ptrace
Sie können auch die Ausführung eines Programms ändern. Wenn Sie dies tun, kann das Programm sehr leicht abstürzen.Solche Dinge werden über Systemaufrufe erledigt , was bedeutet, dass der Prozess eine Anfrage an den Kernel stellt und der Kernel diese erfüllt. Der Kernel macht auch die Magie, um
ptrace()
Arbeit zu machen . Dies bedeutet zwar nicht, dass es unmöglich ist, über sich selbst zu stolpern (was ein Fehler wäre), aber es scheint unwahrscheinlich, da dies explizit einer seiner Zwecke ist: Prozesse auf einem Multitasking-System zu koordinieren.quelle
Ich stelle fest, dass das Stracing von GUI-Prozessen selbst unter neueren Betriebssystemen häufig zu Abstürzen führt (zumindest OpenSuse 12.3 habe ich 13.1 nicht speziell ausprobiert, da ich das Stracing von GUI-Prozessen so gut wie aufgegeben habe).
Ich kann mich nicht erinnern, dass das Stracing eines Nicht-GUI-Prozesses zu Abstürzen auf einem neueren Betriebssystem geführt hat.
quelle
nvidia-modprobe
Helfer fehlschlägt. Dastrace
ptraces es funktioniert, funktioniert sein suid nicht, so dass es fehlschlägt und die CUDA-Bibliothek das Programm beendet.Ja. Es ist selten und ich habe keine gute Idee warum, aber es passiert definitiv. Vor kurzem war mir dies passiert, als ich einen lang laufenden "Swapoff" -Befehl verfolgte, und es gab weder einen Netzwerkzugriff noch irgendetwas anderes, das so aussah, als würde / sollte es ein Problem verursachen. Trotzdem wurde der Prozess kurz nach dem Anbringen der Strace beendet.
Es sieht so aus, als hätte der Prozess beschlossen, freiwillig zu beenden, aber angesichts der Tatsache, dass er mehrere Stunden gelaufen war, bevor die Strace gestartet wurde, bezweifle ich, dass dieser Prozess zufällig war.
Ja, Strace kann manchmal dazu führen, dass der Prozess abgebrochen wird, aber es ist selten genug, dass die Vorteile guter Informationen dieses Risiko überwiegen können.
Eine andere Option unter Linux wäre zu überprüfen
/proc/<PID>/stack
, wo der Prozess derzeit blockiert ist. Dies ist sicherer, bietet jedoch weniger dynamische Informationen.quelle