Переполнение стека из собственной библиотеки DLL, вызываемой из управляемого приложения - PullRequest
4 голосов
/ 09 апреля 2009

Я получаю печально известное исключение 0xC00000FD (переполнение стека) из моего приложения, когда я вызываю нативную DLL. Это делается из управляемого приложения C # в Windows CE 5 (процессор SH4). Компилирование той же DLL для Windows XP с использованием того же управляемого приложения, и все работает нормально (без переполнения). Подпрограмма в DLL выполняет очень сложную рекурсию, которая, в конечном счете, и является причиной переполнения, но, опять же, она отлично работает на ПК.

Кажется, мне просто нужно отрегулировать размер стека при сборке DLL? Я считаю, что размер стека по умолчанию для CE и XP составляет 1 МБ при использовании компилятора Visual C (я использую Visual Studio 2005, если это имеет значение). Если они оба по умолчанию имеют одинаковый размер, я не уверен, почему один переполнится, а другой - нет. Я попытался настроить размер стека с помощью флага компилятора / F и флага компоновщика / STACK, но это, похоже, ничего не дало. Мне также не совсем понятно, что я могу указать размер стека в DLL, но исполняемый файл должен его установить. Но если это так, как бы я изменил размер стека для моего управляемого процесса, чтобы использовать его при вызове в собственную DLL?

1 Ответ

4 голосов
/ 09 апреля 2009

Вот ссылка на обсуждение архитектуры памяти Windows CE.

В конечном счете, очень мало что можно сделать, чтобы настроить размер стека программно или во время компиляции; ОС будет меняться в зависимости от ряда факторов, включая доступность памяти. Установка размера стека с помощью / F устанавливает только значение по умолчанию, которое ОС может (и часто будет) игнорировать. И / F не работает на .DLL, так или иначе; это работает только при компиляции исполняемого файла. .DLLs не имеют стека; это принадлежит потоку и (в конечном счете) процессу.

Возможно, пришло время вернуться к чертежной доске, чтобы удалить рекурсию.

...