Как отладить "Это приложение запросило среду выполнения, чтобы завершить его необычным способом." когда я даже не могу войти в код?
У меня есть программа на C++, которая выдает эту ошибку, как только начинается процесс - очевидно, до того, как какой-либо пользовательский код выполняется. Это происходит только при включенном встраивании. Даже со встроенными символами отладки я не могу войти в код. Как только я нажимаю F10 в Visual Studio, я получаю сообщение об ошибке, и программа останавливается. Я проверил все исключения / проверки в "Отладке / Исключениях", но все еще не получил перерыв.
Обычно я ожидаю, что что-то подобное происходит из-за отсутствия зависимости во время выполнения, но я вполне уверен, что это не так (проверено с помощью Dependency Walker).
редактировать: я использовал рекомендацию Стива Таунсенда о CDB, и теперь я могу пройтись по частям программы, написанным до кода пользователя. Последняя трассировка стека:
Child-SP RetAddr Call Site
00000000`0008e308 00000000`7541601a ntdll!ZwTerminateProcess+0xa
00000000`0008e310 00000000`7540cf87 wow64!Wow64EmulateAtlThunk+0x86ba
00000000`0008e340 00000000`7539276d wow64!Wow64SystemServiceEx+0xd7
00000000`0008ec00 00000000`7540d07e wow64cpu!TurboDispatchJumpAddressEnd+0x24
00000000`0008ecc0 00000000`7540c549 wow64!Wow64SystemServiceEx+0x1ce
00000000`0008ed10 00000000`7776ae27 wow64!Wow64LdrpInitialize+0x429
00000000`0008f260 00000000`777672f8 ntdll!LdrGetKnownDllSectionHandle+0x1a7
00000000`0008f760 00000000`77752ace ntdll!RtlInitCodePageTable+0xe8
00000000`0008f7d0 00000000`00000000 ntdll!LdrInitializeThunk+0xe
2 ответа
Вы можете попробовать настроить Process Dumper и настроить его для вашего EXE, чтобы создать дамп при любом выходе из процесса. Затем запустите процесс из командной строки, чтобы исключить любые артефакты среды IDE.
Это должно дать вам дамп для посмертной отладки и, возможно, колл-стэк из выходного потока, который может быть полезен.
Вероятно, это связано с порядком инициализации ваших глобальных переменных. В C++ порядок между модулями не определен. Так что, если инициализатор глобала зависит от того, что глобал в другом модуле уже инициализируется, у вас проблемы.
Можно поставить точку останова в коде инициализации CRT, который выполняется перед вызовом main (или wmain, или WinMain, или чего бы вы ни использовали). Вы можете пройти этот код и посмотреть, что вызывает проблему.
Другая возможная причина - функция DllMain возвращает ошибку или вызывает исключение во время DLL_PROCESS_ATTACH.