Wenn ich ein interaktives Programm (z. B. MySQL) von Cygwin unter Windows 10 aus ausführe, bleibt die Eingabe einfach hängen und tut nichts. Wenn ich Strg+C drücke, kann ich sehen, dass die Eingabe an die Konsole gesendet wird.
Ich sehe auch seltsame Ergebnisse von anderen interaktiven Programmen (pry, irb) – unter Windows 7 hat alles einwandfrei funktioniert.
Hat das jemand gesehen und gelöst?
Antwort1
Wenn bei Strace ein Segmentierungsfehler auftritt, liegt die Ursache höchstwahrscheinlich an einem Antivirusprogramm.
Der neueste Auslöser dieses Problems ist der Micro Trend
https://cygwin.com/ml/cygwin/2016-08/msg00092.html
Im letzten Monat wurden mehrere Fälle gemeldet
Antwort2
In der Cygwin-Umgebung ist der Linux-Befehl „strace“ verfügbar. strace gibt alle Interaktionen zwischen Betriebssystem und Anwendung aus (in diesem Fall Anwendung <--> Cygwin <--> Betriebssystem), und der spezifische Systemaufruf oder andere Vorgang, bei dem es einfriert, sollte offensichtlich sein.
Um strace zu verwenden, stellen Sie einfach den strace-Befehl vor den Befehl, der die Anwendung startet, die Sie debuggen möchten. Wenn Sie beispielsweise mysql vom Cygwin-Terminal aus mit dem Befehl starten mysql
, rufen Sie es stattdessen als auf strace mysql
.
Wenn die Ausgabe von strace bei einfrierenden Programmen nicht sichtbar ist, posten Sie die Ausgabe bitte in Pastebin oder einem gleichwertigen Programm (versuchen Sie nicht, Ihrer Antwort etwas hinzuzufügen, da dies eine riesige Textmenge wäre).
Der nächste Schritt wäre, es mit einem Debugger wie gdb auszuführen, aber in einem solchen Fall reicht strace normalerweise aus.
Aktualisieren
Anscheinend wurde in den letzten Monaten ein Fehler in den Cygwin-Port von Strace eingeführt. Bei einer Google-Suche nach „Cygwin Strace Seg Fault“ war mir das nicht bewusst. Da Strace das beste Tool für diese Aufgabe ist, versuchen Sie, Ihre Cygwin-Installation zu aktualisieren, um festzustellen, ob absichtlich oder versehentlich ein Fix eingeführt wurde. Um Ihre Cygwin-Installation zu aktualisieren, verwenden Sie die folgende Befehlsfolge:
wget -NP /usr/local/bin/ http://cygwin.com/setup-x86_64.exe
chmod u+x /usr/local/bin/setup-x86_64.exe
/usr/local/bin/setup-x86_64.exe -n
Versuchen Sie es nach der Aktualisierung erneut. Wenn es immer noch zu einem Segmentierungsfehler kommt, wird es etwas komplizierter, da gdb weitaus schwieriger zu verwenden ist und es in der Cygwin-Umgebung meines Wissens keine echten Äquivalente zu strace gibt.
Es besteht immer die Chance, dass das Update Ihre Startprobleme behebt und Strace hinfällig wird (die Chance ist jedoch nicht sehr groß …)
Aktualisierung 2
Wenn der Cygwin-Befehl strace nach dem Update einen Segmentierungsfehler verursacht, ist es meiner Meinung nach am besten, einen nativen Windows-Benutzerbereichs-Debugger wie logger.exe zu verwenden. Installationsinformationen finden SieHier.
logger.exe wird auf ähnliche Weise wie strace verwendet. Das Problem besteht darin, dass Sie nun Cygwin-Übersetzungen der Systemaufrufe der Programme angezeigt bekommen, nicht die tatsächlichen Systemaufrufe. Mit anderen Worten, es werden nur die Interaktionen zwischen Betriebssystem und Cygwin betrachtet, und die Einzelheiten des fehlerhaften Programms können verschleiert werden. Ein Hängenbleiben oder Einfrieren kann jedoch fast immer entweder auf eine Ressourcenbeschränkung oder einen nicht reagierenden Systemaufruf zurückgeführt werden, und diese Methode wird dies offenlegen.
Da ich dies als Alternative zu etwas (strace) anbiete, das nach dem Update möglicherweise noch funktioniert, werde ich nicht näher auf die spezifische Verwendung eingehen. Im Grunde werden Sie (nach der Installation) Cygwin von einer Windows-Eingabeaufforderung aus aufrufen, der das Programm logger.exe vorangestellt ist, genau wie ich strace beschrieben habe. Dann wird ein interaktives Cygwin-Terminal geöffnet und Sie müssen das Programm starten, das Sie auswerten. Die Logger-Anwendung (sollte) eine enorme Menge Text ausgeben, der beschreibt, was Cygwin und sein untergeordneter Prozess „Ihr Programm“ tun. Wenn ein Hängenbleiben auftritt, sollte der spezifische Systemaufruf oder die Ressource, auf die gewartet wird, offensichtlich sein. Auch hier gilt: Wenn dies nicht der Fall ist, veröffentlichen Sie den vollständigen Text der Logger-Ausgabe.