Не уверен, что здесь происходит.
У меня есть консольное приложение 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) ??
Некоторые вопросы -
ли другое поведение из-за PATH имеющегося в VS2008?
Возможно ли, что у меня нет установленной среды исполнения VC90 на моей машине?
Я думал, что, связывая статически (/ MT), у меня не было бы требования к установке времени исполнения VC90?
Я все еще не понимаю/NODEFAULTLIB. Это уместно?
Я привык к Makefiles и компиляторов, и я знаю, C. Я не знаю, C++, поэтому я пишу в C. Но я не понимаю, все капризы CRT на Windows. Может кто-то прояснить эту тайну?
Хм, хорошо. Хорошие идеи. Я слишком долго занимаюсь C# ... – Cheeso
Это немного сложно, потому что OP находится в Windows, но запуск вашей программы под Valgrind застанет эти ошибки памяти, которые скрывает отладчик. Glibc также помечает всю неиспользованную память специальным шаблоном, когда установлен параметр «MALLOC_PERTURB_», и любой шаблон, отличный от «NULL», хорош для обнаружения ошибок - я не знаю, есть ли эквивалент в Windows CRT. – ephemient
У меня было множество маленьких переполнений буфера. Неряшливый неряшливый неряшливый. Посмотрите, какое кодирование в .NET вы получите?В любом случае спасибо за напоминание. – Cheeso