cmd.exeから実行するとCベースのコンソールアプリがクラッシュし、VS2008デバッガーで正常に実行されますか?
-
16-09-2019 - |
質問
ここで何が起こっているのかわからない。
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) ??
いくつかの質問 -
VS2008内で利用可能なパスのため、動作は異なりますか?
原因は、私が自分のマシンにVC90ランタイムをインストールしていないということですか?
静的にリンク(/mt)することで、VC90ランタイムをインストールする必要がないと思いましたか?
私はまだ理解していません /nodefaultlib。それは関連性がありますか?
私はメイクファイルとコンパイラに慣れていますが、Cを知っています。C++はC ++を知りません。誰かがこの謎を片付けることができますか?
解決
通常、デバッガーで何かが機能しているのを見たとき、それ以外はどこにもありません。それは無知のメモリによるものです。デバッガーは、それがあなたに好意を与えているかのように、あなたのために記憶をクリアするのに「十分にいい」です。
2番目の可能性はバッファオーバーランであり、デバッガーはマロックのメモリ位置を避けるために十分に動き回ります。あなたの失敗がマロック中に現れていることを考えると、私はこれを疑うでしょう。 Mallocチェーンを破壊している可能性があります。
際立っているもう1つの可能性は、ある種の人種状態であり、デバッガーはあなたがそれを逃れるのに十分なタイミングを変えています。