0

ここで何が起こっているのかわからない。
Cで記述されたWindowsコンソールアプリがあります。VS2008内から実行すると、正常に実行されます。cmd.exeプロンプトから実行すると、通常はmalloc()でクラッシュします。CRTライブラリの不一致による競合状態だと思います。

アプリはシンプルです。
WinHttpレイヤーを呼び出してGETリクエストをWebサイトに送信し、応答を丸呑みにします。その部分は正常に機能しているように見えますが、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のすべての気まぐれを理解していません。誰かがこの謎を解くことができますか?

4

1 に答える 1

3

通常、デバッガーで何かが機能するのを見たが、他の場所では機能しない場合、それは初期化されていないメモリが原因です。デバッガーは、あたかもそれがあなたに有利に働いているかのように、あなたのためにメモリをクリアするのに「十分に良い」です。

2番目の可能性はバッファオーバーランであり、デバッガーが原因で、mallocのメモリ位置が移動して回避できるようになっています。あなたの失敗がmalloc中に現れていることを考えると、これは疑わしいでしょう。mallocチェーンが破損している可能性があります。

目立つもう1つの可能性は、ある種の競合状態であり、デバッガーはタイミングを変更して、それを回避できるようにします。

于 2009-07-16T04:12:59.013 に答える