Как отладить "Это приложение запросило среду выполнения, чтобы завершить его необычным способом."когда я даже не могу войти в код? - PullRequest
4 голосов
/ 28 июня 2011

У меня есть программа на C ++, которая выдает эту ошибку, как только начинается процесс - очевидно, до того, как какой-либо пользовательский код выполняется.Это происходит только при включенном встраивании.Даже со встроенными символами отладки я не могу войти в код.Как только я нажимаю F10 в Visual Studio, я получаю сообщение об ошибке, и программа останавливается.Я проверил все исключения / проверки в «Отладке / Исключениях», но все еще не получил перерыв.

Обычно я ожидал бы, что что-то подобное происходит из-за отсутствующей зависимости во время выполнения, но я вполне уверен, что это не такслучай здесь (проверено с помощью Dependency Walker).

edit: я использовал рекомендацию Стива Таунсенда о 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 ]

2 голосов
/ 28 июня 2011

Вы можете попробовать настроить Process Dumper и настроить его для вашего EXE, чтобы создать дамп при любом выходе из процесса. Затем запустите процесс из командной строки, чтобы исключить любые артефакты среды IDE.

Это должно дать вам дамп для посмертной отладки, и, возможно, вызов из стека выхода из потока, который может быть полезен.

1 голос
/ 28 июня 2011

Вероятно, это связано с порядком инициализации ваших глобальных переменных. В C ++ порядок между модулями не определен. Поэтому, если инициализатор глобала зависит от того, что глобал в другом модуле уже инициализируется, у вас проблемы.

Можно поставить точку останова в коде инициализации CRT, который выполняется перед вызовом main (или wmain, или WinMain, или того, что вы используете). Вы можете просмотреть этот код и посмотреть, что является причиной проблемы.

Другая возможная причина - функция DllMain возвращает ошибку или вызывает исключение во время DLL_PROCESS_ATTACH.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...