Я не уверен, что вы на правильном пути в диагностике этого как переполнения стека.
Но в любом случае, тот факт, что вы получаете пуф! , плюс то, что вы видите в WinDbg
В аварийный дамп будет входить только один поток, который называется Sleep (). Все остальные темы вышли.
подсказывает мне, что кто-то вызывал функцию exit () C RTL или, возможно, напрямую вызывал Windows API TerminateProcess (). Это может иметь отношение к вашим обработчикам прерываний или нет. Возможно, что-то в логике обработки исключений имеет проверку на повторный вход и произвольно решает выйти (), если он повторно введен.
Мое предложение состоит в том, чтобы исправить ваши исполняемые файлы, чтобы поместить, возможно, отладку INT 3 в точку входа в exit (), если она статически связана, или если она динамически связана, исправьте импорт, а также исправьте любой импорт kernel32: : TerminateProcess вместо этого выбрасывает DebugBreak ().
Конечно, exit () и / или TerminateProcess () также могут вызываться при обычном завершении работы, поэтому вам придется отфильтровывать ложные тревоги, но если вы сможете получить стек вызовов для случая, когда он вот-вот доказательство, у вас должно быть то, что вам нужно.
РЕДАКТИРОВАТЬ ДОБАВИТЬ: просто написать свою собственную версию exit () и связать ее вместо CRTL-версии, что может помочь.