Console App на основе C при запуске с cmd.exe работает нормально в отладчике VS2008?
-
16-09-2019 - |
Вопрос
Не уверен, что здесь происходит.
У меня есть приложение для консоли Windows, написанное в C. Когда я запускаю его из VS2008, оно работает нормально. Если я запускаю его из подсказки cmd.exe, он сбои, обычно в Malloc (). Я предполагаю, что это гоночное состояние из -за несоответствующей библиотеки CRT.
Приложение простое.
Он звонит на слой Winhttp, чтобы отправить запрос на GET на веб -сайт, а затем сокращает ответ. Эта часть, кажется, работает нормально, но после Winhttpreaddata программа вызывает printf (), чтобы распечатать полученные данные, и именно здесь часто происходит авария Malloc.
Но только вне отладчик. ????
Я компилируюсь из командной строки.
c:\vc9\bin\cl.exe /Zi /DEBUG -Ic:\vc9\Include
-IC:\WindowsSDK\v6.1\Include HttpGet.c
-link /debug /out:HttpGet.exe /SUBSYSTEM:CONSOLE /LIBPATH:c:\vc9\Lib
/LIBPATH:C:\WindowsSDK\v6.1\Lib WinHttp.lib
Я вижу результаты выше, если я компилируюсь с /MT или ничего. Если я компилируюсь с /MD, то он висит при запуске в отладчике, при вызове Free (), и он сбой в Cmd.exe (так же, как с /MT).
run in result: /MT result: /MD
--------- ------------ -----------
VS2008 debugger runs fine hang in free() (at the end)
cmd.exe crash in malloc crash in malloc
"VC cmd prompt" crash or hang(spin) ??
Некоторые вопросы -
Является ли различное поведение из -за пути в VS2008?
Может ли причина быть в том, что у меня нет времени выполнения VC90 на моей машине?
Я думал, что, связывая статически (/МТ), у меня не было бы требования, чтобы необходимость установить время выполнения VC90?
Я до сих пор не понимаю /nodefaultlib. Это актуально?
Я привык к созданию и компиляторам, и я знаю, C. Я не знаю C ++, поэтому я пишу в C., но я не понимаю всех капризов CRT на окнах. Может кто -нибудь прояснить эту загадку?
Решение
Как правило, когда я видел, как что -то работает в отладчике, но нигде больше, это связано с ненициализированной памятью. Отладчик «достаточно хорош», чтобы очистить память для вас, как будто это делает вам одолжение.
Вторая возможность - это переполнение буфера, и отладчик заставляет местоположение памяти ваших Mallocs передвигаться достаточно, чтобы избежать этого. Я подозреваю, что это, учитывая, что ваша неудача появляется во время Malloc; Вы можете испортить цепь Malloc.
Еще одна возможность, которая выделяется, - это какое -то состояние гонки, и отладчик меняет время достаточно, чтобы позволить вам сойти с рук.