當我在 Windows 10 上從 cygwin 運行互動式程式(例如 mysql)時,輸入只是掛在那裡並且不執行任何操作。如果我按 ctrl-c out,我可以看到輸入被傳送到控制台。
我還看到其他互動式程式(pry、irb)出現奇怪的結果 - 在 Windows 7 上一切正常。
有人見過這個並解決了嗎?
答案1
如果 strace 出現段錯誤,最可能的原因是防毒軟體。
最近導致此問題的是微趨勢
https://cygwin.com/ml/cygwin/2016-08/msg00092.html
上個月報告了幾起此類案件
答案2
在 cygwin 環境中,可以使用 linux 指令「strace」。 strace 輸出所有 OS <--> 應用程式互動(在本例中,應用程式 <--> cygwin <--> OS),並且凍結的特定係統呼叫或其他操作應該是顯而易見的。
要使用 strace,您只需在啟動要偵錯的應用程式的命令之前新增 strace 命令。例如,如果您使用命令從 cygwin 終端啟動 mysql mysql
,請將其稱為strace mysql
.
如果在凍結程式上執行 strace 的輸出不明顯,請將輸出發佈到 Pastebin 或同等內容(不要嘗試添加到您的答案中,這將是大量文字)。
下一步是使用 gdb 等調試器運行它,但在這種情況下 strace 通常就足夠了。
更新
顯然,過去幾個月在 cygwin 的 strace 連接埠中引入了一個錯誤;根據Google搜尋“cygwin strace seg failure”;我不知道這一點。由於 strace 是完成這項工作的最佳工具,請嘗試更新您的 cygwin 安裝,看看是否有意或無意地引入了修復。若要更新 cygwin 安裝,請使用下列命令序列:
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
更新後,再試一次。如果它仍然出現段錯誤,事情會變得有點混亂,因為 gdb 遠不太容易使用,而且據我目前所知,在 cygwin 環境中沒有真正的 strace 等效項。
更新總有可能解決您的啟動問題,而 strace 成為一個有爭議的問題(機會不是很大...)
更新2
如果更新後 cygwin strace 命令出現段錯誤,我認為最好的選擇是使用本機 Windows 使用者空間偵錯器,例如 logger.exe。可以找到安裝訊息這裡。
logger.exe 的使用方式與 strace 類似,問題是您現在將公開程式系統呼叫的 cygwins 翻譯,而不是實際的系統呼叫。換句話說,它只會查看作業系統與 cygwin 的交互,而違規程式的細節可能會被混淆。然而,掛起或凍結幾乎總是歸因於資源限製或無響應的系統調用,並且此方法將暴露這一點。
由於我提供它作為更新後可能仍然有效的某些東西(strace)的替代方案,因此我不會詳細介紹它的特定用法。基本上,您要做的(安裝後)是從 Windows 命令提示字元中呼叫 cygwin,前面加上 logger.exe 程序,就像我描述 strace 一樣。然後將開啟一個互動式 cygwin 終端,您需要啟動您正在評估的程式。記錄器應用程式(應該)輸出大量文本,描述 cygwin 及其子進程「您的程式」正在做什麼。當發生掛起時,正在等待的特定係統呼叫或資源應該是顯而易見的。同樣,如果不是,請發布記錄器輸出的全文。