0

不知道这里发生了什么。
我有一个用 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. 由于 PATH 在 VS2008 中可用,是否存在不同的行为?

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

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

  4. 我还是不明白 /NODEFAULTLIB。这有关系吗?

我习惯于制作文件和编译器,而且我知道 C。我不知道 C++,这就是我用 C 编写的原因。但我不理解 Windows 上 CRT 的所有变幻莫测。有人能解开这个谜吗?

4

1 回答 1

3

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

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

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

于 2009-07-16T04:12:59.013 回答