2009-07-16 3 views
0

Не уверен, что здесь происходит.
У меня есть консольное приложение Windows, написанное на C. Когда я запускаю его из VS2008, он работает нормально. Если я запустил его из приглашения cmd.exe, он сработает, как правило, в malloc(). Я предполагаю, что это состояние гонки из-за несоответствующей библиотеки CRT.Сбой приложения на базе C при запуске из cmd.exe, отлично работает в отладчике VS2008?

Приложение прост.
Он вызывает уровень 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. Это уместно?

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

ответ

3

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

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

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

+0

Хм, хорошо. Хорошие идеи. Я слишком долго занимаюсь C# ... – Cheeso

+0

Это немного сложно, потому что OP находится в Windows, но запуск вашей программы под Valgrind застанет эти ошибки памяти, которые скрывает отладчик. Glibc также помечает всю неиспользованную память специальным шаблоном, когда установлен параметр «MALLOC_PERTURB_», и любой шаблон, отличный от «NULL», хорош для обнаружения ошибок - я не знаю, есть ли эквивалент в Windows CRT. – ephemient

+0

У меня было множество маленьких переполнений буфера. Неряшливый неряшливый неряшливый. Посмотрите, какое кодирование в .NET вы получите?В любом случае спасибо за напоминание. – Cheeso