2009-07-18 20 views
1

に例外をスロー作成は、ページヒープでGFLAGSで実行ページヒープの破損を追跡することができました。のCSocket ::私は自分のアプリケーション(VC MFC)を持っている私のMFCアプリケーション

今、誰もが発生した理由は正確に何に光を投げることができるアプリケーションがクラッシュした、それはこのエラーを示して、私は(リソースinavailablityの感触を持つ以外の)これらの行

を解釈することができませんでしたアプリのクラッシュ?

(情報:アプリケーションがマルチで、約500のスレッドが実行されているマルチスレッドの一つです - プロセッサマシン)

kernel32!RaiseException+53 
msvcrt!_CxxThrowException+36 
mfc42u!AfxThrowResourceException+19 
mfc42u!AfxRegisterWndClass+ab 
mfc42u!CAsyncSocket::AttachHandle+5c 
mfc42u!CAsyncSocket::Socket+25 
mfc42u!CAsyncSocket::Create+14 

答えて

0

これはあなたの実際のヒープ破損の問題である場合、私は疑問に思う、またはあなたのプログラムがちょうどヒットしている場合Pageheapで実行した結果としてのリソース制限。

は、私は正確な詳細を覚えていることはできませんが、ページヒープが有効にせずに使用するよりもはるかに早くメモリ不足に実行できるように、ページヒープはそんなに、余分なメモリのオーバーヘッドが発生します。実行中の500個のスレッドを

、あなたはそれぞれの1MBのスタック、加えて、彼らが道に沿って動的に割り当てられたすべてのメモリを持っています。それは、ウィンドウを作成できない場合

CAsyncSocket::AttachHandleAfxThrowResourceExceptionをトリガします。 Pageheapによってシステムが飽和しているようです。

問題を再現するには、500スレッドの実行が必要ですか?その数を少し減らすことができれば、より多くのリソースが利用可能になるでしょう。

+0

イエスタページヒープは、より多くのメモリを要求しますが、ヒープ破損注入ポイントが必要です。 アプリケーションがこのロードされた状態で実行されると、アプリケーションがクラッシュします。 クラッシュの別のポイントは、ハイエンドマシン(8コアおよび4 GB RAM)でアプリケーションを実行している場合、この特定の場所でクラッシュした多くのインスタンスです。 mfc42u!CFixedAlloc :: Alloc + 5c mfc42u! CString :: AllocBuffer + 25 mfc42u!CString :: CString + 3e WP_Communications_Server!CWPGenericService :: AddToMessageLog + b9 手掛かりがありますか?私たちは2週間以上この問題に悩まされています。 – buddingspacer

+0

Full Pageheapが必要ですか、またはhttp://support.microsoft.com/kb/286470でNormalと試すことができますか? ヒープが破損しているため、どこかでクラッシュする可能性があります。あなたは私の質問に答えたことはありません - テスト中にリソースを節約するためにスレッドの実行量を減らす機会はありますか?または、500のスレッドが実行されている場合にのみ動作が向上しますか? –

4

これと同じ問題は私にナットを推進してきましたが、最終的には私はそれを固定し、それが働いています。これは、我々が

CSocket socket; 
socket.Create(); 

ような何かをしようとすると、スレッド内の[メインアプリケーションスレッド以外]、それは未処理の例外をスローすることをMFCソケットライブラリのバグです。私はマイクロソフトから何かを言ってSee What Microsoft says about this

の記事を見つけましたが、それはどちらか私を助けていません。だからここに私が見つけた回避策と私はそれが私のようないくつかの挫折した仲間を助けることができることを願っています。スレッド内

それはソケットハンドルの割り当てによって既に作成されているように、その後この

CSocket mySock; 
SOCKET sockethandle = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
mySock.m_hSocket= sockethandle; 

を行うことmySock.Createを呼び出すことはありません。 mySock.Attach(sockethandle)を私がまだ試していないので使用できるかどうかはわかりません。

その後、Connectなどを直接呼び出すことができます。

ソケットの使用が終了したら、mySock.Close()に電話するのではなく、closesocket(mySock.m_hSocket);を呼び出してください。ソケットオブジェクトが解放されます。 Attachが上のケースで動作する場合は、ソケットを解放するときにここでDetachを実行する必要があると思います。

グッドラック

+0

ここにあなたのポストではなかったら私は私の問題を見つけられませんでした。私は古いMFCアプリケーションをサービスとして動作させようとしていて、なぜサービス内でCreate()とListen()を呼び出せなかったのかわかりませんでした。私は間違った軌道に乗っていて、ネットワークアクセス権限と関係があると思っていましたが、実際にはこれとCAsyncSocketにウィンドウが必要であるという事実が関係していました。 Attach()はまだサービス内では動作しませんが、少なくとも今どこから問題が発生しているかを知っています。私はたぶんWinSockを使って独自のCSocket実装を作成します。感謝万円! – jbx

関連する問題