glfwsleep ()가 어떻게 segfault를 유발할 수 있습니까?
-
05-09-2019 - |
문제
멀티 크레디 한 응용 프로그램에서는 Sleep () 함수 (GLFW 라이브러리에서 나온 기능)를 사용하고 있습니다.
glfwSleep(..);
그리고 그것은 통화 스택이 표시되는 것처럼 내 응용 프로그램을 segfaulting으로 이끌었습니다.
#0 76CFC2BC WaitForSingleObjectEx() (C:\Windows\system32\kernel32.dll:??)
#1 00000016 ??() (??:??)
#2 0000006C ??() (??:??)
#3 00000000 ??() (??:??)
그만큼 glfwSleep()
스레드 내부에서 사용됩니다. 위험합니까? 내 프로그램이 왜 그 결과로 분류 되는가?
편집하다:
의 매개 변수 일 때 glfwSleep()
<0.02 (secs)는 segfault가 아닙니다!
편집 2 :
GLFW의 공식 문서에서 :
스레드 응용 프로그램을 작성하기 전에 스레드 응용 프로그램을 작성하는 것이 매우 어색 할 수 있지만, 따라야 할 간단한 몇 가지 주요 규칙이 있습니다.
- 항상 스레드간에 공유되는 데이터에 대한 독점 액세스를 보장하십시오!
- 스레드가 올바르게 동기화되어 있는지 확인하십시오!
- 바쁘지 않아!
내 대답을 받았다고 생각합니다 .. 지금 대안을 찾으려고합니다 ..
감사!
해결책
에서 GLFW 위키:
GLFW는 GHC 스레드, 포르 키오 또는 스레드 델레이에서 잘 작동하지 않습니다. 따라서 가능하다면 피하십시오.
다른 팁
segfault'ed 스레드가 glfwsleep ()의 발신자와 동일한 스레드입니까?
WaitformultipleObjectsex API의 호출로 인한 충돌로 보입니다. 올바른 동기화 객체 및 숫자를 WaitformultipleObjectsex로 지정하고 전달합니까?
인용합니다 실용적인 프로그래머,
``select '' '가 깨지지 않았습니다
OS 또는 컴파일러 또는 타사 제품 또는 라이브러리에서 버그를 찾는 것은 드 rare니다. 버그는 응용 프로그램에서 가장 가능성이 높습니다.
당신의 프로그램이 전화를하는 이유 WaitForSingleObjectEx()
언제 glfwSleep()
전화 Sleep()
? 글쎄, 당신은 소스 코드가 없지만 Sleep()
, 그것은 완전히 블랙 박스가 아닙니다. 분해 Sleep()
그리고 아마도 당신은 아마도 (당신이 가진 Windows 버전에 따라) Sleep()
전화 나 꼬리 집 SleepEx()
. XP에서 SleepEx()
전화 NtDelayExecutionThread()
, 그리고 Vista에서 그것은 전화합니다 WaitForSingleObjectEx()
.
그렇다면 나머지 스택은 어떻게 되었습니까? 00000016, 0000006C 및 00000000은 유효한 반환 주소가 아닙니다. 코드 어딘가에 스택 해소 된 버퍼에 대한 포인터를 다른 스레드로 전달하고 프로그램이 잠자는 동안 다른 스레드가 첫 번째 스레드 스택을 손상 시킨다고해서 놀라지 않을 것입니다. 들어가십시오 Sleep()
, 리턴 주소에 메모리 중단 점을 넣으면 범인을 잡을 수 있습니다.