Консольное приложение на основе C вылетает при запуске из cmd.exe, нормально работает в отладчике VS2008? - PullRequest
0 голосов
/ 16 июля 2009

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

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

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

  4. Я все еще не понимаю / NODEFAULTLIB. Это актуально?

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

1 Ответ

3 голосов
/ 16 июля 2009

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

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

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

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