2009-07-16 74 views
0

不知道这是怎么回事。
我有用C编写的Windows控制台应用程序。当我从VS2008运行它时,它运行良好。如果我从cmd.exe提示符运行它,它通常在malloc()中崩溃。我猜测这是由于CRT库不匹配造成的竞争条件。从cmd.exe运行时,基于C的控制台应用程序崩溃,在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. 是因为内VS2008提供的路径的不同的行为?

  2. 问题原因是我没有在我的机器上安装VC90运行时?

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

  4. 我还是不明白/ NODEFAULTLIB。这是相关的吗?

我用的makefile和编译器,我知道C.我不知道C++这就是为什么我在写C.但我不明白,在Windows上CRT的所有变化无常。有人能清除这个谜团吗?

回答

3

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

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

另一种突出的可能性是某种竞争条件,调试器正在改变足够的时机让你摆脱困境。

+0

嗯,好的。好主意。我一直在做C#太长...... – Cheeso 2009-07-16 04:29:01

相关问题