Вопрос Крашит автокаст

Начинающий
Статус
Оффлайн
Регистрация
5 Апр 2023
Сообщения
3
Реакции[?]
0
Поинты[?]
0
Всем привет, хукаю PrepareUnitOrders, EntitySystem, итерируюсь нахожу скилы, айтемы, героев, все отлично находит, начинаю кастовать в ближайшего к курсору врага скилы с помощью хукнутой PrepareUnitOrders с интервалом в 200мс, все отлично кастуется, но через неопределенное кол-во кастов есть вероятность что дота просто перейдет в статус "Не отвечает", никаких исключений не отлавливает, это точно не дедлок, так как я пробовал делать каст по таймеру в while(true) (знаю, кринж, но хоть проверил), а не по отдельному потоку, вся та же картина, я хз что делать.
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
851
Реакции[?]
335
Поинты[?]
67K
Всем привет, хукаю PrepareUnitOrders, EntitySystem, итерируюсь нахожу скилы, айтемы, героев, все отлично находит, начинаю кастовать в ближайшего к курсору врага скилы с помощью хукнутой PrepareUnitOrders с интервалом в 200мс, все отлично кастуется, но через неопределенное кол-во кастов есть вероятность что дота просто перейдет в статус "Не отвечает", никаких исключений не отлавливает, это точно не дедлок, так как я пробовал делать каст по таймеру в while(true) (знаю, кринж, но хоть проверил), а не по отдельному потоку, вся та же картина, я хз что делать.
хук это как коллбек(т.е. перехват/реакция/обработка какого-либо "события", например функция какаято вызвалась и ты это перехватил и чето там делаешь) только насильно установленный а не официально зарегистрированный. ты уверен что ты правильно это слово используешь?
когда тред "завис" это значит он не делает нужной работы - т.е. либо ждёт внешних каких-то оповещений(дедлок), либо делает очень много(или бесконечно много) какойто работы на каком-то этапе и не доходит до другой работы(например бесконечный цикл где-то). в любом случае смотри стактрейс мейн треда(процесс хакером например) и дебажь дальше оттуда.
а так вообще любое взаимодействие с игрой должно быть как правило исключительно из мейн треда(т.е. надо хукать чтото что каждый кадр/тик вызывается и оттуда работать с игрой) из соображений синхронизации с игровой логикой(надо свою логику встраивать в правильные моменты игровой логики и уважать оригинальный порядок игровой логики, например не надо трогать вещи параллельно(на другом ядре процессора) с тем как игра их удаляет обновляет и т.д.). если ты не из мейн треда приказы отправляешь то наверно следует перестать это делать.
ну и код в студию
 
Начинающий
Статус
Оффлайн
Регистрация
5 Апр 2023
Сообщения
3
Реакции[?]
0
Поинты[?]
0
хук это как коллбек(т.е. перехват/реакция/обработка какого-либо "события", например функция какаято вызвалась и ты это перехватил и чето там делаешь) только насильно установленный а не официально зарегистрированный. ты уверен что ты правильно это слово используешь?
когда тред "завис" это значит он не делает нужной работы - т.е. либо ждёт внешних каких-то оповещений(дедлок), либо делает очень много(или бесконечно много) какойто работы на каком-то этапе и не доходит до другой работы(например бесконечный цикл где-то). в любом случае смотри стактрейс мейн треда(процесс хакером например) и дебажь дальше оттуда.
а так вообще любое взаимодействие с игрой должно быть как правило исключительно из мейн треда(т.е. надо хукать чтото что каждый кадр/тик вызывается и оттуда работать с игрой) из соображений синхронизации с игровой логикой(надо свою логику встраивать в правильные моменты игровой логики и уважать оригинальный порядок игровой логики, например не надо трогать вещи параллельно(на другом ядре процессора) с тем как игра их удаляет обновляет и т.д.). если ты не из мейн треда приказы отправляешь то наверно следует перестать это делать.
ну и код в студию
Спасибо за ответ, я реально кст хукнул PrepareUnitOrders и вызывал свой хук в котором вызывал ориг функцию. Сейчас просто вызываю ориг функцию напрямую.
Хукнул Present и попробовал обрабатывать нажатия клавиш уже в нем и теперь никаких проблем, крашей не наблюдаю.
Большое спасибо.
В момент зависания попробовал посмотреть стактрейс мейн треда и заметил
0, ntdll.dll!NtWaitForAlertByThreadId+0x14
1, ntdll.dll!RtlWaitOnAddress+0x44d
2, ntdll.dll!RtlWaitOnAddress+0x302
3, ntdll.dll!RtlWaitOnAddress+0x11d
4, ntdll.dll!RtlEnterCriticalSection+0x214
5, ntdll.dll!RtlEnterCriticalSection+0x42
6, tier0.dll!CThreadMutex::LockForWrite+0x1e
дедлок ?

консоль доты(visual studio debug)
CSwapChainBase::QueuePresentAndWait() looped for 31 iterations without a present event.
Excessive frame time of 348.56ms clamped. Acting as if the frame only took 100.00ms. (Last amnesty was 'SDL_EVENT(0x20e)', 3.56s ago)
CSwapChainBase::QueuePresentAndWait() looped for 42 iterations without a present event.
CSwapChainBase::QueuePresentAndWait() looped for 43 iterations without a present event.
CSwapChainBase::QueuePresentAndWait() looped for 44 iterations without a present event.
CSwapChainBase::QueuePresentAndWait() looped for 45 iterations without a present event.
CSwapChainBase::QueuePresentAndWait() looped for 46 iterations without a present event.
Hitch alert: Present was waiting for 47 iterations and 0.5 seconds.
CSwapChainBase::QueuePresentAndWait() looped for 47 iterations without a present event.
Hitch alert: Present was waiting for 48 iterations and 0.5 seconds.
CSwapChainBase::QueuePresentAndWait() looped for 48 iterations without a present event.
Hitch alert: Present was waiting for 49 iterations and 0.5 seconds.
CSwapChainBase::QueuePresentAndWait() looped for 49 iterations without a present event.
......
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
851
Реакции[?]
335
Поинты[?]
67K
Спасибо за ответ, я реально кст хукнул PrepareUnitOrders и вызывал свой хук в котором вызывал ориг функцию. Сейчас просто вызываю ориг функцию напрямую.
Хукнул Present и попробовал обрабатывать нажатия клавиш уже в нем и теперь никаких проблем, крашей не наблюдаю.
Большое спасибо.
В момент зависания попробовал посмотреть стактрейс мейн треда и заметил
0, ntdll.dll!NtWaitForAlertByThreadId+0x14
1, ntdll.dll!RtlWaitOnAddress+0x44d
2, ntdll.dll!RtlWaitOnAddress+0x302
3, ntdll.dll!RtlWaitOnAddress+0x11d
4, ntdll.dll!RtlEnterCriticalSection+0x214
5, ntdll.dll!RtlEnterCriticalSection+0x42
6, tier0.dll!CThreadMutex::LockForWrite+0x1e
дедлок ?

консоль доты(visual studio debug)
CSwapChainBase::QueuePresentAndWait() looped for 31 iterations without a present event.
Excessive frame time of 348.56ms clamped. Acting as if the frame only took 100.00ms. (Last amnesty was 'SDL_EVENT(0x20e)', 3.56s ago)
CSwapChainBase::QueuePresentAndWait() looped for 42 iterations without a present event.
CSwapChainBase::QueuePresentAndWait() looped for 43 iterations without a present event.
CSwapChainBase::QueuePresentAndWait() looped for 44 iterations without a present event.
CSwapChainBase::QueuePresentAndWait() looped for 45 iterations without a present event.
CSwapChainBase::QueuePresentAndWait() looped for 46 iterations without a present event.
Hitch alert: Present was waiting for 47 iterations and 0.5 seconds.
CSwapChainBase::QueuePresentAndWait() looped for 47 iterations without a present event.
Hitch alert: Present was waiting for 48 iterations and 0.5 seconds.
CSwapChainBase::QueuePresentAndWait() looped for 48 iterations without a present event.
Hitch alert: Present was waiting for 49 iterations and 0.5 seconds.
CSwapChainBase::QueuePresentAndWait() looped for 49 iterations without a present event.
......
ну если тред никогда не пробуждается из этого NtWaitForAlertByThreadId, то да, дедлок(он же может пробуждаться(то есть там не бесконечное ожидание а просто очень долгое по какой-либо причине), че-нибудь делать быстренько и потом обратно в спячку, смотреть надо)
презент тоже не идеал(он не в мейн треде, там мультитред рендеринг в доте), хукай что-нибудь в мейн треде(всякие FrameStageNotify, CNetworkClientService::OnClientFrameSimulate и т.д.)
 
Сверху Снизу