不确定这里发生了什么。
我有一个用C语言编写的Windows控制台应用程序。当我从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中的PATH可用,会出现不同的行为吗?
原因可能是我的机器上没有安装VC90运行时?
我认为通过静态链接(/ MT)我不需要安装VC90运行时吗?
我仍然不明白/ NODEFAULTLIB。这有关系吗?
我习惯于编写文件和编译器,我知道C.我不知道C ++这就是我用C语言编写的原因。但我不了解Windows上CRT的所有变幻莫测。有人可以澄清这个谜吗?
答案 0 :(得分:3)
通常当我在调试器中看到某些工作但其他地方没有工作时,这是由于未初始化的内存。调试器“足够好”,可以为您清除内存,就好像这对您有利。
第二种可能性是缓冲区溢出,调试器导致mallocs的内存位置移动到足以避免它。鉴于你的失败在malloc期间出现,我会怀疑这一个;你可能正在破坏malloc链。
另一种突出的可能性是某种竞争条件,并且调试器正在改变时间,足以让你逃脱它。