Способ размещения стека для потока в Windows выглядит следующим образом (примерно; это не точное описание всего, что происходит, просто достаточно, чтобы дать вам представление. И способ, которым CLR обрабатывает страницы стека,несколько отличается от того, как неуправляемый код также обрабатывает его.)
В верхней части стека находятся все выделенные вами страницы.Затем появляется «страница защиты» - если вы нажмете эту страницу, страница защиты станет новой страницей стека, а следующая страница станет новой страницей защиты.Тем не менее, последняя страница стека является особенной.Если вы нажмете его один раз, вы получите исключение переполнения стека.Если вы нажмете дважды , тогда процесс будет остановлен немедленно .Под «немедленно» я подразумеваю «немедленно» - не исключение, иди прямо в тюрьму, не проходи, не собирай 200 долларов.Операционная система объясняет, что в этот момент процесс глубоко поврежден и, возможно, он стал активно враждебным для пользователя.Стек переполнен, и код, переполняющий стек, может пытаться записать сколь угодно много мусора в память.(*)
Поскольку этот процесс потенциально представляет опасность для себя и других, операционная система отключает его, не позволяя выполнять больше кода.
Я подозреваю, что что-то в вашем неуправляемом кодедважды попадает на последнюю страницу стека.Почти каждый раз, когда я вижу, что процесс внезапно исчезает без каких-либо исключений или других объяснений, потому что была запущена страница стека «Не связывайся со мной».
(*) В начале 1990-х я работал над драйверами баз данныхдля маленькой операционной системы под названием NetWare.У него не было такого рода средств защиты, которые обычно используются в более современных операционных системах.Мне нужно было иметь возможность динамически «переключать стеки» при работе на уровне защиты ядра;Я знал, когда мой драйвер случайно сорвал стек, потому что он в конечном итоге записал бы в экранную память, и тогда я мог отладить проблему, посмотрев, какой мусор был записан прямо на экран.Ах, это были дни.