![Windows 10 和 cygwin 挂起问题](https://linux22.com/image/1503133/Windows%2010%20%E5%92%8C%20cygwin%20%E6%8C%82%E8%B5%B7%E9%97%AE%E9%A2%98.png)
当我在 Windows 10 上从 cygwin 运行交互式程序(例如 mysql)时,输入只是挂在那里,什么也不做。如果我按 ctrl-c 退出,我可以看到输入被发送到控制台。
我还看到了其他交互式程序(pry、irb)的奇怪结果 - 在 Windows 7 上一切都运行正常。
有人见过这个问题并解决过吗?
答案1
如果 strace 发生段错误,最可能的原因是防病毒软件。
导致此问题的最新原因是 Micro Trend
https://cygwin.com/ml/cygwin/2016-08/msg00092.html
上个月报告了几起此类案件
答案2
在 cygwin 环境中,可以使用 linux 命令“strace”。strace 输出所有操作系统 <--> 应用程序交互(在本例中为应用程序 <--> cygwin <--> 操作系统),并且它所冻结的特定系统调用或其他操作应该是显而易见的。
要使用 strace,只需在启动要调试的应用程序的命令前添加 strace 命令即可。例如,如果您使用命令从 cygwin 终端启动 mysql mysql
,则将其改为调用strace mysql
。
如果在冻结程序上运行 strace 的输出不明显,请将输出发布到 pastebin 或同等位置(不要尝试添加到您的答案中,这将是大量的文本)。
下一步是使用 gdb 等调试器运行它,但在这种情况下,strace 通常就足够了。
更新
显然,在过去的几个月中,strace 的 cygwin 端口中出现了一个错误;根据谷歌搜索“cygwin strace seg 错误”;我之前不知道这个。由于 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) 的替代方案,因此我不会详细介绍它的具体用法。基本上,您要做的(安装后)是从 logger.exe 程序前面的 Windows 命令提示符中调用 cygwin,就像我描述的 strace 一样。然后会打开一个交互式 cygwin 终端,您需要从该终端启动您正在评估的程序。记录器应用程序应该输出大量文本,描述 cygwin 及其子进程“您的程序”正在做什么。当发生挂起时,正在等待的特定系统调用或资源应该是显而易见的。同样,如果不是,请发布记录器输出的完整文本。