gpt4 book ai didi

基于 C 的控制台应用程序从 cmd.exe 运行时崩溃,在 VS2008 调试器中运行良好?

转载 作者:太空宇宙 更新时间:2023-11-04 07:43:05 24 4
gpt4 key购买 nike

不确定这里发生了什么。
我有一个用 C 编写的 Windows 控制台应用程序。当我从 VS2008 中运行它时,它运行良好。如果我从 cmd.exe 提示符运行它,它会崩溃,通常是在 malloc() 中。我猜这是由于 CRT 库不匹配导致的竞争条件。

应用程序很简单。
它调用 WinHttp 层向网站发送 GET 请求,然后接收回复。那部分看起来没问题,但是在WinHttpReadData之后,程序会调用printf()打印出接收到的数据,这也是malloc crash经常发生的地方。

但仅在调试器之外。???

我正在从命令行编译。

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。这相关吗?

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

最佳答案

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

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

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com