从cmd.exe运行时基于C的控制台应用程序崩溃,在VS2008调试器中运行正常吗?

时间:2009-07-16 04:06:59

标签: c windows visual-studio-2008 msvcrt cl.exe

不确定这里发生了什么。
我有一个用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)    ?? 

一些问题 -

  1. 由于VS2008中的PATH可用,会出现不同的行为吗?

  2. 原因可能是我的机器上没有安装VC90运行时?

  3. 我认为通过静态链接(/ MT)我不需要安装VC90运行时吗?

  4. 我仍然不明白/ NODEFAULTLIB。这有关系吗?

  5. 我习惯于编写文件和编译器,我知道C.我不知道C ++这就是我用C语言编写的原因。但我不了解Windows上CRT的所有变幻莫测。有人可以澄清这个谜吗?

1 个答案:

答案 0 :(得分:3)

通常当我在调试器中看到某些工作但其他地方没有工作时,这是由于未初始化的内存。调试器“足够好”,可以为您清除内存,就好像这对您有利。

第二种可能性是缓冲区溢出,调试器导致mallocs的内存位置移动到足以避免它。鉴于你的失败在malloc期间出现,我会怀疑这一个;你可能正在破坏malloc链。

另一种突出的可能性是某种竞争条件,并且调试器正在改变时间,足以让你逃脱它。