Console App на основе C при запуске с cmd.exe работает нормально в отладчике VS2008?

StackOverflow https://stackoverflow.com/questions/1135337

Вопрос

Не уверен, что здесь происходит.
У меня есть приложение для консоли 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)    ?? 

Некоторые вопросы -

  1. Является ли различное поведение из -за пути в VS2008?

  2. Может ли причина быть в том, что у меня нет времени выполнения VC90 на моей машине?

  3. Я думал, что, связывая статически (/МТ), у меня не было бы требования, чтобы необходимость установить время выполнения VC90?

  4. Я до сих пор не понимаю /nodefaultlib. Это актуально?

Я привык к созданию и компиляторам, и я знаю, C. Я не знаю C ++, поэтому я пишу в C., но я не понимаю всех капризов CRT на окнах. Может кто -нибудь прояснить эту загадку?

Это было полезно?

Решение

Как правило, когда я видел, как что -то работает в отладчике, но нигде больше, это связано с ненициализированной памятью. Отладчик «достаточно хорош», чтобы очистить память для вас, как будто это делает вам одолжение.

Вторая возможность - это переполнение буфера, и отладчик заставляет местоположение памяти ваших Mallocs передвигаться достаточно, чтобы избежать этого. Я подозреваю, что это, учитывая, что ваша неудача появляется во время Malloc; Вы можете испортить цепь Malloc.

Еще одна возможность, которая выделяется, - это какое -то состояние гонки, и отладчик меняет время достаточно, чтобы позволить вам сойти с рук.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top