Цитировать Прагматичный программист ,
`` выберите ’’ не сломано
Редко
найти ошибку в ОС или компиляторе,
или даже сторонний продукт или
библиотека. Ошибка, скорее всего, в
применение.
Почему ваша программа вызывает WaitForSingleObjectEx()
, когда glfwSleep()
вызывает Sleep()
? Ну, хотя у вас нет исходного кода для Sleep()
, это не совсем черный ящик. Разберите Sleep()
, и вы, вероятно, увидите (в зависимости от того, какая у вас версия Windows), что Sleep()
либо вызывает, либо выполняет хвостовые вызовы SleepEx()
. В XP SleepEx()
вызывает NtDelayExecutionThread()
, а в Vista - WaitForSingleObjectEx()
.
Так что случилось с остальной частью вашего стека? 00000016, 0000006C и 00000000 не являются действительными адресами возврата. Я не удивлюсь, если где-нибудь в вашем коде вы передадите указатель на буфер, выделенный стеком, другому потоку, и пока ваша программа спит, этот другой поток разрушает стек первого потока. Войдите в Sleep()
, установите точку возврата памяти на обратный адрес, и вы сможете поймать виновного.