不知道这是怎么回事。
我有一个用C编写的应用程序,当我从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) ?? 一些问题-
我习惯于制作文件和编译器,我知道C。我不知道C++,这就是我用C写的原因,但我不理解Windows上所有变幻莫测的CRT。有人能解开这个谜团吗?
发布于 2009-07-16 04:12:59
通常,当我在调试器中看到一些东西工作,但在其他地方,它是由于未初始化的内存。调试器“足够好”,可以为您清除内存,好像这是在帮您的忙。
第二种可能是缓冲区溢出,调试器导致您的错误的内存位置移动到足以避免它。考虑到您的失败是在malloc过程中出现的,我会怀疑这个问题;您可能正在破坏malloc链。
另一个突出的可能性是某种种族条件,调试器正在改变时间,让您可以逃脱它。
https://stackoverflow.com/questions/1135337
复制相似问题