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는 모든 OS <--> 애플리케이션 상호 작용(이 경우 애플리케이션 <--> cygwin <--> OS)을 출력하며 정지 중인 특정 시스템 호출이나 기타 작업이 분명해야 합니다.
strace를 사용하려면 디버깅하려는 애플리케이션을 시작하는 명령 앞에 strace 명령을 추가하기만 하면 됩니다. 예를 들어 cygwin 터미널에서 명령을 사용하여 mysql을 시작하는 경우 mysql
대신 로 호출하십시오 strace mysql
.
정지 프로그램에서 strace를 실행하여 얻은 출력이 명확하지 않은 경우 출력을 Pastebin 또는 이에 상응하는 도구에 게시하십시오(답변에 추가하려고 하지 마십시오. 엄청난 양의 텍스트가 됩니다).
다음 단계는 gdb와 같은 디버거를 사용하여 실행하는 것이지만, 이러한 경우 일반적으로 strace로 충분합니다.
업데이트
분명히 지난 몇 달 동안 strace의 cygwin 포트에 버그가 도입되었습니다. 'cygwin strace seg failure'에 대한 Google 검색에 따라; 나는 그것을 몰랐습니다. 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
업데이트 후 다시 시도해 보세요. 여전히 segfault가 발생하면 gdb는 사용하기가 훨씬 쉽지 않고 현재 내가 알고 있는 cygwin 환경에는 strace와 실제로 동등한 것이 없기 때문에 상황이 조금 더 복잡해집니다.
업데이트가 실행 문제를 해결할 가능성은 항상 있으며, strace는 논란의 여지가 있습니다(별로 큰 가능성은 아닙니다...).
업데이트 2
업데이트 후 cygwin strace 명령 segfault가 발생하는 경우 가장 좋은 방법은 logger.exe와 같은 기본 Windows 사용자 공간 디버거를 사용하는 것입니다. 설치정보를 확인하실 수 있습니다여기.
logger.exe는 strace와 유사한 방식으로 사용됩니다. 문제는 이제 실제 시스템 호출이 아닌 프로그램 시스템 호출의 cygwins 번역이 노출된다는 것입니다. 즉, cygwin 상호 작용을 위해 OS만 살펴보고 문제가 되는 프로그램의 세부 사항이 난독화될 수 있습니다. 그러나 정지 또는 정지는 거의 항상 리소스 제한이나 응답하지 않는 시스템 호출로 인해 발생할 수 있으며 이 방법을 사용하면 이를 알 수 있습니다.
업데이트 후에도 여전히 작동할 수 있는 항목(strace)에 대한 대안으로 이 기능을 제공하므로 구체적인 사용법에 대해서는 자세히 설명하지 않겠습니다. 기본적으로 설치 후 수행할 작업은 strace에 대해 설명한 대로 logger.exe 프로그램 앞에 추가된 Windows 명령 프롬프트에서 cygwin을 호출하는 것입니다. 그러면 대화형 cygwin 터미널이 열리고 여기에서 평가할 프로그램을 시작해야 합니다. cygwin과 그 하위 프로세스 "귀하의 프로그램"이 수행하는 작업을 설명하는 로거 응용 프로그램에서는 엄청난 양의 텍스트를 출력해야 합니다. 정지가 발생하면 대기 중인 특정 시스템 호출이나 리소스가 분명해야 합니다. 그렇지 않은 경우에도 로거 출력의 전체 텍스트를 게시하세요.