2015-09-01 2 views
3

У меня возникла проблема, когда мое приложение не выполняет утверждение об отладке (_CrtIsValidHeapPointer) до того, как что-либо даже выполнено. Я знаю это, потому что я добавил точку останова в первом выражении моей основной функции, и она не выполняет утверждение до достижения точки останова.Visual Studio: отладка перед вызовом функции main()

Есть ли способ каким-то образом «пройти» все, что происходит до того, как моя главная функция называется? Такие вещи, как инициализация статических элементов и т. Д.

Следует отметить, что моя программа написана на C++/CLI. Недавно я обновился до VS2015 и нацелился на набор инструментов v140. Библиотеки C++, которые я использую (ImageMagick, libsquish и одна из моих собственных библиотек C++), были протестированы индивидуально, и я не получаю ошибку утверждения с этими библиотеками, поэтому это должно быть мое основное приложение.

Я не изменил код, так как я обновился от VS2013, так что я немного озадачен тем, что происходит.

EDIT: Здесь находится стек вызовов. Это после того, как я нажму «Повторить» в окне с ошибкой утверждения. Затем я получаю множество других исключений, но они разные при каждом запуске программы.

> ucrtbased.dll!527a6853()  
[Frames below may be incorrect and/or missing, no symbols loaded for ucrtbased.dll] 
ucrtbased.dll!527a7130()  
ucrtbased.dll!527a69cb()  
ucrtbased.dll!527c8116()  
ucrtbased.dll!527c7eb3()  
ucrtbased.dll!527c7fb3()  
ucrtbased.dll!527c84b0()  
PathCreator.exe!_onexit(int (void)* const function) Line 268 + 0xe bytes C++ 
PathCreator.exe!atexit(void (void)* const function) Line 276 + 0x9 bytes C++ 
PathCreator.exe!std::`dynamic initializer for '_Fac_tidy_reg''() Line 65 + 0xd bytes C++ 
[External Code] 
mscoreei.dll!7401cd87()  
mscoree.dll!741fdd05() 
kernel32.dll!76c33744()  
ntdll.dll!7720a064()  
ntdll.dll!7720a02f()  
+0

Вы можете попробовать другой отладчик, обычно [tag: WinDbg]. Это непросто, но попробуйте. Запустите исполняемый файл из WinDbg, на первой точке останова [установите символы] (http://stackoverflow.com/questions/30019889/how-to-set-up-symbols-in-windbg) и запустите приложение ('g '). Когда вызывается исключение, покажите его ('.exr -1') и callstack (' k'). '! analysis -v' может также дать некоторые результаты. Если вы рассматриваете WinDbg как опцию, я могу написать более подробный ответ, но пока это помечено как Visual Studio. –

ответ

4

Необходимо выполнить отладку кода инициализации времени выполнения C. Неинтуитивно, потому что отладчик пытается избежать этого и вместо этого вы попадете в главную() точку входа. Но все же можно использовать Debug> New Breakpoint> Function Breakpoint.

Введите _initterm для имени функции, Language = C.

Нажмите F5, и точка останова будет хитом. Вы должны увидеть исходный код времени выполнения C. Теперь вы можете выполнять однократное выполнение функций инициализации вашей программы, каждый вызов которого выполняется (**it)().


Это именно то, о чем вы просили. Но не очень вероятно, что вы на самом деле хотите. Шансы, что ваш код вызывает эту ошибку, очень низкие. Гораздо более вероятно, что одна из этих библиотек вызывает эту проблему. Вероятно, они будут построены с таргетингом на еще версии библиотеки времени выполнения C. И, следовательно, имеют свою собственную функцию _initterm().

Наличие более одной копии библиотеки времени выполнения C в процессе, как правило, очень нездорово. И, скорее всего, будет генерировать кучу коррупции. Если вы не можете найти его из трассировки стека (обязательно измените тип отладчика с Auto на Mixed, всегда отправляйте трассировку стека в вопросе SO), то следующая вещь, которую вы должны: strong рассмотреть, это восстановление этих библиотек с помощью VS версия, которую вы используете.

+0

Странно, я добавил эту точку останова функции, и она все еще не выполнила утверждение отладки, прежде чем она попала в точку останова. Я нажал «Продолжить» и просмотрел множество других ошибок, но никогда не попадал в точку останова на _initterm. Что касается перекомпиляции библиотек, я перекомпилировал все 3 библиотеки C++, которые я использую, и гарантировал, что я настроил таргетинг на тот же набор инструментов (v140).Я редактировал свой вопрос, чтобы включить стек вызовов. –

+0

Тогда почему вы приняли ответ? – rustyx

Смежные вопросы