Kann strace / ptrace zum Absturz eines Programms führen?


7

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?


Es gab eine Zeit mit alten Kerneln, die Fehler aufwiesen, in denen das Trennen von einem Prozess dazu führte, dass er "verschwand" (SIGKILL bekam). Das passiert seit vielen Jahren nicht mehr, aber vielleicht lesen Sie über einige Mythen, die es noch gibt. Beachten Sie, dass Sie mit ptrace in den Prozessspeicher schreiben können, strace jedoch keine ptrace-Aufrufe dafür verwendet.
PlasmaHH

Antworten:


10

Nein , stracesollte 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, was straceich denke, also ist es ähnlich. Man kann einfach mehr als stracebei ptrace()direkter Verwendung .


Ihr Beispiel wäre genau diese Art von Fehler:

In diesem Beispiel stracewü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. Mit stracenur ein bisschen mehr. Aber jede andere Anwendung hätte das Timing mehr verändern können, wie das Starten eines Programms.


+1 Um WRT-Sockets zu klären, wäre es nicht der tatsächliche Aufbau einer Verbindung, der einen solchen Fehler auslösen würde. Ich kann mir nicht wirklich vorstellen, dass jemand Allzweck-Netzwerkcode schreibt, der in diesem Sinne zeitkritisch war, obwohl dies offensichtlich möglich ist. Ich bin gespannt, was Sie unter der Komplikation "Laufzeitspeicherorte" verstehen.
Goldlöckchen

Oh, stimmt, der Netzwerkcode würde aus gut getesteten Bibliotheken stammen. In Bezug auf den Speicher habe ich "nur angenommen", dass die Instrumentierung mit Strace die Speichernutzung oder den Prozess irgendwie ändert, so dass Nullzeiger jetzt auf eine andere Stelle zeigen. Hmmm ... wenn die straceInstrumentierung vollständig außerhalb des verfolgten Prozesses erfolgt, kann dies falsch sein. ('ltrace' sollte dabei sein und die Adressen der Bibliotheksaufrufe ändern)
Volker Siegel

1
Genau die Informationen, die ich gesucht habe, danke! In einer gut geschriebenen Anwendung sollte strace / ptrace also grundsätzlich keine Probleme verursachen. Probleme, die bei der Verwendung von strace / ptrace auftreten, können auch durch andere Faktoren (z. B. langsamere Computer) ausgelöst werden. Ich glaube nicht, dass ptrace die Speicherorte ändert, aber ich muss das überprüfen.
Brandon Wamboldt

........... Genau!
Volker Siegel

straceverwendet nur Abhörfunktionen von ptrace. ptraceSie können auch die Ausführung eines Programms ändern. Wenn Sie dies tun, kann das Programm sehr leicht abstürzen.
Gilles 'SO - hör auf böse zu sein'

3

Was würde passieren, wenn Sie einen laufenden Prozess so belasten würden, wie er einen Netzwerk-Socket oder ähnliches erstellt?

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.


1

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.


Ich konnte sehen, wie das Verfolgen eines GUI-Programms von einem Terminal, das unter derselben GUI (derselben X11-Anzeige) ausgeführt wird, möglicherweise einen Deadlock auslösen kann, aber das Verfolgen eines GUI-Programms von einer anderen Stelle oder das Verfolgen mit der in eine Datei umgeleiteten Trace-Ausgabe sollte dies nicht tun kann das nicht verursachen.
Celada

GUI-Programme haben aufgrund der schlampigen Codierung oft viele Rennbedingungen. Dies führt zu Abstürzen. Beispielsweise sendet das Programm möglicherweise mehrere Befehle an X und erwartet, dass alle in einem anderen Thread oder Signalhandler vollständig sind. Sie erhalten einen unerwarteten Wert zurück und wissen nicht, was sie tun sollen.
Zan Lynx

2
Ich habe das gleiche Problem mit einigen GUI-Programmen und habe es auf die proprietäre CUDA-Bibliothek von NVidia zurückgeführt, die den Prozess beendet, wenn der (SUID-) nvidia-modprobeHelfer fehlschlägt. Da straceptraces es funktioniert, funktioniert sein suid nicht, so dass es fehlschlägt und die CUDA-Bibliothek das Programm beendet.
Score_Under

0

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.

>strace -p 73358
strace: Process 73358 attached
getuid()                                = 0
geteuid()                               = 0
getgid()                                = 0
getegid()                               = 0
prctl(PR_GET_DUMPABLE)                  = 1
stat("/etc/fstab", {st_mode=S_IFREG|0644, st_size=2168, ...}) = 0
open("/etc/fstab", O_RDONLY|O_CLOEXEC)  = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2168, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f24e5cd8000
read(3, "\n#\n# /etc/fstab\n# Created by ana"..., 4096) = 2168
read(3, "", 4096)                       = 0
close(3)                                = 0
munmap(0x7f24e5cd8000, 4096)            = 0
close(1)                                = 0
close(2)                                = 0
exit_group(-1)                          = ?
+++ exited with 255 +++

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.