cmd.exeから実行するとCベースのコンソールアプリがクラッシュし、VS2008デバッガーで正常に実行されますか?

StackOverflow https://stackoverflow.com/questions/1135337

質問

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

アプリは簡単です。
WinHTTPレイヤーを呼び出して、Webサイトに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でコンパイルすると、Debuggerで実行されると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。それは関連性がありますか?

私はメイクファイルとコンパイラに慣れていますが、Cを知っています。C++はC ++を知りません。誰かがこの謎を片付けることができますか?

役に立ちましたか?

解決

通常、デバッガーで何かが機能しているのを見たとき、それ以外はどこにもありません。それは無知のメモリによるものです。デバッガーは、それがあなたに好意を与えているかのように、あなたのために記憶をクリアするのに「十分にいい」です。

2番目の可能性はバッファオーバーランであり、デバッガーはマロックのメモリ位置を避けるために十分に動き回ります。あなたの失敗がマロック中に現れていることを考えると、私はこれを疑うでしょう。 Mallocチェーンを破壊している可能性があります。

際立っているもう1つの可能性は、ある種の人種状態であり、デバッガーはあなたがそれを逃れるのに十分なタイミングを変えています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top