不知道这是怎么回事。
我有一个用C编写的Windows控制台应用程序。当我在VS2008中运行它时,它运行得很好。如果我从cmd.exe提示符运行它,它会崩溃,通常在malloc()中。我猜这是一个竞争条件,因为不匹配的CRT库。
这个应用程序很简单。
它调用WinHttp层向网站发送GET请求,然后slurps回复。这一部分似乎工作得很好,但是在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中的路径可用吗?
原因可能是我的机器上没有安装VC90运行时吗?
我想通过静态链接(/MT)我就不需要安装VC90运行时了?
我还是不明白/NODEFAULTLIB。这有关系吗?
我习惯于制作文件和编译器,我知道C。我不知道C++,这就是为什么我在C.写的,但是我不理解Windows上CRT的所有变幻莫测。有人能解开这个谜团吗?

最佳答案

通常,当我在调试器中看到某个东西在其他地方工作时,这是由于未初始化的内存造成的。调试器“足够好”为您清除内存,好像这是在帮您一个忙。
第二种可能是缓冲区溢出,调试器导致malloc的内存位置移动到足以避免它的位置。考虑到你的失败是在malloc期间出现的,我会怀疑这个;你可能是在破坏malloc链。
另一个突出的可能性是某种竞争条件,调试器正在改变足够的时间,让您摆脱它。

关于c - 从cmd.exe运行时,基于C的控制台应用程序崩溃了,在VS2008调试器中运行正常吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1135337/

10-14 16:40
查看更多