【问题标题】:C-based console app crashes when run from cmd.exe, runs fine in VS2008 debugger?从 cmd.exe 运行时基于 C 的控制台应用程序崩溃,在 VS2008 调试器中运行良好?
【发布时间】:2009-07-16 04:06:58
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 这有点困难,因为 OP 在 Windows 上,但是在 Valgrind 下运行程序会捕获调试器隐藏的那些内存错误。当设置MALLOC_PERTURB_ 时,Glibc 还会用特殊模式标记所有未使用的内存,NULL 以外的任何模式都有助于捕获错误——我不知道 Windows 的 CRT 中是否有等效模式。
    • 我有一堆小的缓冲区溢出。邋遢邋遢邋遢。看看 .NET 中的哪些编码会让您受益?无论如何感谢您的提醒。
    猜你喜欢
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多