2009-07-16 69 views
0

不知道這是怎麼回事。
我有用C編寫的Windows控制檯應用程序。當我從VS2008運行它時,它運行良好。如果我從cmd.exe提示符運行它,它通常在malloc()中崩潰。我猜測這是由於CRT庫不匹配造成的競爭條件。從cmd.exe運行時,基於C的控制檯應用程序崩潰,在VS2008調試器中運行良好?

該應用程序很簡單。
它調用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提供的路徑的不同的行爲?

  2. 問題原因是我沒有在我的機器上安裝VC90運行時?

  3. 我認爲通過靜態鏈接(/ MT)我不需要安裝VC90運行時的需求?

  4. 我還是不明白/ NODEFAULTLIB。這是相關的嗎?

我用的makefile和編譯器,我知道C.我不知道C++這就是爲什麼我在寫C.但我不明白,在Windows上CRT的所有變化無常。有人能清除這個謎團嗎?

回答

3

通常,當我在調試器中看到某些工作但沒有其他地方時,這是由於未初始化的內存。調試器「足夠好」爲你清理內存,就好像這對你有幫助。

第二種可能性是緩衝區溢出,並且調試器正在導致malloc的內存位置移動到足以避免它。我會懷疑這個給你的失敗是在malloc期間出現的;你可能會破壞malloc鏈。

另一種突出的可能性是某種競爭條件,調試器正在改變足夠的時機讓你擺脫困境。

+0

嗯,好的。好主意。我一直在做C#太長...... – Cheeso 2009-07-16 04:29:01

相關問題